[Lldb-commits] [PATCH] D61212: [lldb] [lit] Add tests for reading ZMM registers (AVX512)

2019-04-27 Thread Michał Górny via Phabricator via lldb-commits
mgorny added a comment.

For the record, GCC refuses to build this with:

  Inputs/x86-zmm-read.cpp: In function ‘int main()’:
  Inputs/x86-zmm-read.cpp:193:4: error: more than 30 operands in ‘asm’
 );
  ^

Not sure if we care about it though; clang doesn't seem to have this limitation.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61212/new/

https://reviews.llvm.org/D61212



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D61210: [lldb] [lit] Introduce tests for reading x86 general purpose registers

2019-04-27 Thread Michał Górny via Phabricator via lldb-commits
mgorny added a comment.

GCC refuses to build this with:

  Inputs/x86-64-gp-read.cpp: In function ‘int main()’:
  Inputs/x86-64-gp-read.cpp:31:1: error: bp cannot be used in asm here
   }
   ^
  Inputs/x86-gp-read.cpp: In function ‘int main()’:
  Inputs/x86-gp-read.cpp:31:1: error: bp cannot be used in asm here
   }
   ^

Clang doesn't complain but it also seems to generally exhibit special 
assumptions about *bp not being touched by assembly. In this particular case, 
it seems to generate correct code (with push/pop for rbp around my code).


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61210/new/

https://reviews.llvm.org/D61210



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D61210: [lldb] [lit] Introduce tests for reading x86 general purpose registers

2019-04-27 Thread Michał Górny via Phabricator via lldb-commits
mgorny added a comment.

Oh wait, that push/pop doesn't really work when I modify the stack pointer ;-). 
I suppose this doesn't really cause any problems because we don't continue the 
program past `int3` though.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61210/new/

https://reviews.llvm.org/D61210



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [lldb] r359375 - [lldb] [lit] Cleanly terminate Register tests

2019-04-27 Thread Michal Gorny via lldb-commits
Author: mgorny
Date: Sat Apr 27 00:43:29 2019
New Revision: 359375

URL: http://llvm.org/viewvc/llvm-project?rev=359375&view=rev
Log:
[lldb] [lit] Cleanly terminate Register tests

Continue the Register test processes, and let them terminate cleanly
rather than implicitly terminating them along with lldb.

Modified:
lldb/trunk/lit/Register/x86-64-read.test
lldb/trunk/lit/Register/x86-64-ymm-read.test
lldb/trunk/lit/Register/x86-mm-xmm-read.test
lldb/trunk/lit/Register/x86-ymm-read.test

Modified: lldb/trunk/lit/Register/x86-64-read.test
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Register/x86-64-read.test?rev=359375&r1=359374&r2=359375&view=diff
==
--- lldb/trunk/lit/Register/x86-64-read.test (original)
+++ lldb/trunk/lit/Register/x86-64-read.test Sat Apr 27 00:43:29 2019
@@ -45,3 +45,6 @@ register read --all
 # CHECK-DAG: xmm13 = {0x51 0x5e 0x5c 0x5a 0x58 0x56 0x54 0x52 0x50 0x5f 0x5d 
0x5b 0x59 0x57 0x55 0x53}
 # CHECK-DAG: xmm14 = {0x61 0x6e 0x6c 0x6a 0x68 0x66 0x64 0x62 0x60 0x6f 0x6d 
0x6b 0x69 0x67 0x65 0x63}
 # CHECK-DAG: xmm15 = {0x71 0x7e 0x7c 0x7a 0x78 0x76 0x74 0x72 0x70 0x7f 0x7d 
0x7b 0x79 0x77 0x75 0x73}
+
+process continue
+# CHECK: Process {{[0-9]+}} exited with status = 0

Modified: lldb/trunk/lit/Register/x86-64-ymm-read.test
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Register/x86-64-ymm-read.test?rev=359375&r1=359374&r2=359375&view=diff
==
--- lldb/trunk/lit/Register/x86-64-ymm-read.test (original)
+++ lldb/trunk/lit/Register/x86-64-ymm-read.test Sat Apr 27 00:43:29 2019
@@ -37,3 +37,6 @@ register read --all
 # CHECK-DAG: ymm13 = {0xd0 0xdf 0xdd 0xdb 0xd9 0xd7 0xd5 0xd3 0xd1 0xde 0xdc 
0xda 0xd8 0xd6 0xd4 0xd2 0x51 0x5e 0x5c 0x5a 0x58 0x56 0x54 0x52 0x50 0x5f 0x5d 
0x5b 0x59 0x57 0x55 0x53}
 # CHECK-DAG: ymm14 = {0xe0 0xef 0xed 0xeb 0xe9 0xe7 0xe5 0xe3 0xe1 0xee 0xec 
0xea 0xe8 0xe6 0xe4 0xe2 0x61 0x6e 0x6c 0x6a 0x68 0x66 0x64 0x62 0x60 0x6f 0x6d 
0x6b 0x69 0x67 0x65 0x63}
 # CHECK-DAG: ymm15 = {0xf0 0xff 0xfd 0xfb 0xf9 0xf7 0xf5 0xf3 0xf1 0xfe 0xfc 
0xfa 0xf8 0xf6 0xf4 0xf2 0x71 0x7e 0x7c 0x7a 0x78 0x76 0x74 0x72 0x70 0x7f 0x7d 
0x7b 0x79 0x77 0x75 0x73}
+
+process continue
+# CHECK: Process {{[0-9]+}} exited with status = 0

Modified: lldb/trunk/lit/Register/x86-mm-xmm-read.test
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Register/x86-mm-xmm-read.test?rev=359375&r1=359374&r2=359375&view=diff
==
--- lldb/trunk/lit/Register/x86-mm-xmm-read.test (original)
+++ lldb/trunk/lit/Register/x86-mm-xmm-read.test Sat Apr 27 00:43:29 2019
@@ -22,3 +22,6 @@ register read --all
 # CHECK-DAG: xmm5 = {0x51 0x5e 0x5c 0x5a 0x58 0x56 0x54 0x52 0x50 0x5f 0x5d 
0x5b 0x59 0x57 0x55 0x53}
 # CHECK-DAG: xmm6 = {0x61 0x6e 0x6c 0x6a 0x68 0x66 0x64 0x62 0x60 0x6f 0x6d 
0x6b 0x69 0x67 0x65 0x63}
 # CHECK-DAG: xmm7 = {0x71 0x7e 0x7c 0x7a 0x78 0x76 0x74 0x72 0x70 0x7f 0x7d 
0x7b 0x79 0x77 0x75 0x73}
+
+process continue
+# CHECK: Process {{[0-9]+}} exited with status = 0

Modified: lldb/trunk/lit/Register/x86-ymm-read.test
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Register/x86-ymm-read.test?rev=359375&r1=359374&r2=359375&view=diff
==
--- lldb/trunk/lit/Register/x86-ymm-read.test (original)
+++ lldb/trunk/lit/Register/x86-ymm-read.test Sat Apr 27 00:43:29 2019
@@ -21,3 +21,6 @@ register read --all
 # CHECK-DAG: ymm5 = {0x51 0x5e 0x5c 0x5a 0x58 0x56 0x54 0x52 0x50 0x5f 0x5d 
0x5b 0x59 0x57 0x55 0x53 0xd0 0xdf 0xdd 0xdb 0xd9 0xd7 0xd5 0xd3 0xd1 0xde 0xdc 
0xda 0xd8 0xd6 0xd4 0xd2}
 # CHECK-DAG: ymm6 = {0x61 0x6e 0x6c 0x6a 0x68 0x66 0x64 0x62 0x60 0x6f 0x6d 
0x6b 0x69 0x67 0x65 0x63 0xe0 0xef 0xed 0xeb 0xe9 0xe7 0xe5 0xe3 0xe1 0xee 0xec 
0xea 0xe8 0xe6 0xe4 0xe2}
 # CHECK-DAG: ymm7 = {0x71 0x7e 0x7c 0x7a 0x78 0x76 0x74 0x72 0x70 0x7f 0x7d 
0x7b 0x79 0x77 0x75 0x73 0xf0 0xff 0xfd 0xfb 0xf9 0xf7 0xf5 0xf3 0xf1 0xfe 0xfc 
0xfa 0xf8 0xf6 0xf4 0xf2}
+
+process continue
+# CHECK: Process {{[0-9]+}} exited with status = 0


___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D61212: [lldb] [lit] Add tests for reading ZMM registers (AVX512)

2019-04-27 Thread Michał Górny via Phabricator via lldb-commits
mgorny updated this revision to Diff 196951.
mgorny added a comment.

Included verification that the program terminates successfully.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61212/new/

https://reviews.llvm.org/D61212

Files:
  lldb/lit/Register/Inputs/x86-zmm-read.cpp
  lldb/lit/Register/x86-64-zmm-read.test
  lldb/lit/Register/x86-zmm-read.test
  
lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/Makefile
  
lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestYMMRegister.py
  
lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestZMMRegister.py
  lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/main.c
  lldb/utils/lit-cpuid/lit-cpuid.cpp

Index: lldb/utils/lit-cpuid/lit-cpuid.cpp
===
--- lldb/utils/lit-cpuid/lit-cpuid.cpp
+++ lldb/utils/lit-cpuid/lit-cpuid.cpp
@@ -29,6 +29,8 @@
 outs() << "sse\n";
   if (features["avx"])
 outs() << "avx\n";
+  if (features["avx512f"])
+outs() << "avx512f\n";
 #endif
 
   return 0;
Index: lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/main.c
===
--- lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/main.c
+++ /dev/null
@@ -1,142 +0,0 @@
-//===-- main.c *- C -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===--===//
-
-void func() {
-  unsigned int ymmvalues[16];
-  for (int i = 0 ; i < 16 ; i++)
-  {
-unsigned char val = (0x80 | i);
-ymmvalues[i] = (val << 24) | (val << 16) | (val << 8) | val;
-  }
-
-  unsigned int ymmallones = 0x;
-#if defined(__AVX__)
-  __asm__("int3;"
-  "vbroadcastss %1, %%ymm0;"
-  "vbroadcastss %0, %%ymm0;"
-  "vbroadcastss %2, %%ymm1;"
-  "vbroadcastss %0, %%ymm1;"
-  "vbroadcastss %3, %%ymm2;"
-  "vbroadcastss %0, %%ymm2;"
-  "vbroadcastss %4, %%ymm3;"
-  "vbroadcastss %0, %%ymm3;"
-  "vbroadcastss %5, %%ymm4;"
-  "vbroadcastss %0, %%ymm4;"
-  "vbroadcastss %6, %%ymm5;"
-  "vbroadcastss %0, %%ymm5;"
-  "vbroadcastss %7, %%ymm6;"
-  "vbroadcastss %0, %%ymm6;"
-  "vbroadcastss %8, %%ymm7;"
-  "vbroadcastss %0, %%ymm7;"
-#if defined(__x86_64__)
-  "vbroadcastss %1, %%ymm8;"
-  "vbroadcastss %0, %%ymm8;"
-  "vbroadcastss %2, %%ymm9;"
-  "vbroadcastss %0, %%ymm9;"
-  "vbroadcastss %3, %%ymm10;"
-  "vbroadcastss %0, %%ymm10;"
-  "vbroadcastss %4, %%ymm11;"
-  "vbroadcastss %0, %%ymm11;"
-  "vbroadcastss %5, %%ymm12;"
-  "vbroadcastss %0, %%ymm12;"
-  "vbroadcastss %6, %%ymm13;"
-  "vbroadcastss %0, %%ymm13;"
-  "vbroadcastss %7, %%ymm14;"
-  "vbroadcastss %0, %%ymm14;"
-  "vbroadcastss %8, %%ymm15;"
-  "vbroadcastss %0, %%ymm15;"
-#endif
-  ::"m"(ymmallones),
-  "m"(ymmvalues[0]), "m"(ymmvalues[1]), "m"(ymmvalues[2]), "m"(ymmvalues[3]),
-  "m"(ymmvalues[4]), "m"(ymmvalues[5]), "m"(ymmvalues[6]), "m"(ymmvalues[7])
-  );
-#endif
-
-#if defined(__AVX512F__)
-  unsigned int zmmvalues[32];
-  for (int i = 0 ; i < 32 ; i++)
-  {
-unsigned char val = (0x80 | i);
-zmmvalues[i] = (val << 24) | (val << 16) | (val << 8) | val;
-  }
-
-  __asm__("int3;"
-  "vbroadcastss %1, %%zmm0;"
-  "vbroadcastss %0, %%zmm0;"
-  "vbroadcastss %2, %%zmm1;"
-  "vbroadcastss %0, %%zmm1;"
-  "vbroadcastss %3, %%zmm2;"
-  "vbroadcastss %0, %%zmm2;"
-  "vbroadcastss %4, %%zmm3;"
-  "vbroadcastss %0, %%zmm3;"
-  "vbroadcastss %5, %%zmm4;"
-  "vbroadcastss %0, %%zmm4;"
-  "vbroadcastss %6, %%zmm5;"
-  "vbroadcastss %0, %%zmm5;"
-  "vbroadcastss %7, %%zmm6;"
-  "vbroadcastss %0, %%zmm6;"
-  "vbroadcastss %8, %%zmm7;"
-  "vbroadcastss %0, %%zmm7;"
-#if defined(__x86_64__)
-  "vbroadcastss %1, %%zmm8;"
-  "vbroadcastss %0, %%zmm8;"
-  "vbroadcastss %2, %%zmm9;"
-  "vbroadcastss %0, %%zmm9;"
-  "vbroadcastss %3, %%zmm10;"
-  "vbroadcastss %0, %%zmm10;"
-  "vbroadcastss %4, %%zmm11;"
-  "vbroadcastss %0, %%zmm11;"
-  "vbroadcastss %5, %%zmm12;"
-  "vbroadcastss %0, %%zmm12;"
-  "vbroadcastss %6, %%zmm13;"
-  "vbroadcastss %0, %%zmm13;"
-  "vbroadcastss %7, %%zmm14;"
-  "vbroadcastss %0, %%zmm14;"
-  "vbroadcastss %8, %%zmm15;"
-  "vbroadcastss %0, %%zmm15;"
- 

[Lldb-commits] [PATCH] D61210: [lldb] [lit] Introduce tests for reading x86 general purpose registers

2019-04-27 Thread Michał Górny via Phabricator via lldb-commits
mgorny updated this revision to Diff 196950.
mgorny added a comment.

Updated to avoid returning to the program with corrupt RSP/RBP. In the 64-bit 
version, I'm saving the initial values in %r8 and %r9; in the 32-bit version, 
I'm using %mm0 and %mm1.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61210/new/

https://reviews.llvm.org/D61210

Files:
  lldb/lit/Register/Inputs/x86-64-gp-read.cpp
  lldb/lit/Register/Inputs/x86-gp-read.cpp
  lldb/lit/Register/x86-64-gp-read.test
  lldb/lit/Register/x86-gp-read.test

Index: lldb/lit/Register/x86-gp-read.test
===
--- /dev/null
+++ lldb/lit/Register/x86-gp-read.test
@@ -0,0 +1,34 @@
+# XFAIL: system-windows
+# REQUIRES: native && target-x86
+# RUN: %clangxx %p/Inputs/x86-gp-read.cpp -o %t
+# RUN: %lldb -b -s %s %t | FileCheck %s
+process launch
+
+register read --all
+# CHECK-DAG: eax = 0x05060708
+# CHECK-DAG: ebx = 0x15161718
+# CHECK-DAG: ecx = 0x25262728
+# CHECK-DAG: edx = 0x35363738
+# CHECK-DAG: edi = 0x75767778
+# CHECK-DAG: esi = 0x65666768
+# CHECK-DAG: ebp = 0x55565758
+# CHECK-DAG: esp = 0x45464748
+# CHECK-DAG: ax = 0x0708
+# CHECK-DAG: bx = 0x1718
+# CHECK-DAG: cx = 0x2728
+# CHECK-DAG: dx = 0x3738
+# CHECK-DAG: di = 0x7778
+# CHECK-DAG: si = 0x6768
+# CHECK-DAG: bp = 0x5758
+# CHECK-DAG: sp = 0x4748
+# CHECK-DAG: ah = 0x07
+# CHECK-DAG: bh = 0x17
+# CHECK-DAG: ch = 0x27
+# CHECK-DAG: dh = 0x37
+# CHECK-DAG: al = 0x08
+# CHECK-DAG: bl = 0x18
+# CHECK-DAG: cl = 0x28
+# CHECK-DAG: dl = 0x38
+
+process continue
+# CHECK: Process {{[0-9]+}} exited with status = 0
Index: lldb/lit/Register/x86-64-gp-read.test
===
--- /dev/null
+++ lldb/lit/Register/x86-64-gp-read.test
@@ -0,0 +1,42 @@
+# XFAIL: system-windows
+# REQUIRES: native && target-x86_64
+# RUN: %clangxx %p/Inputs/x86-64-gp-read.cpp -o %t
+# RUN: %lldb -b -s %s %t | FileCheck %s
+process launch
+
+register read --all
+# CHECK-DAG: rax = 0x0102030405060708
+# CHECK-DAG: rbx = 0x1112131415161718
+# CHECK-DAG: rcx = 0x2122232425262728
+# CHECK-DAG: rdx = 0x3132333435363738
+# CHECK-DAG: rdi = 0x7172737475767778
+# CHECK-DAG: rsi = 0x6162636465666768
+# CHECK-DAG: rbp = 0x5152535455565758
+# CHECK-DAG: rsp = 0x4142434445464748
+# CHECK-DAG: eax = 0x05060708
+# CHECK-DAG: ebx = 0x15161718
+# CHECK-DAG: ecx = 0x25262728
+# CHECK-DAG: edx = 0x35363738
+# CHECK-DAG: edi = 0x75767778
+# CHECK-DAG: esi = 0x65666768
+# CHECK-DAG: ebp = 0x55565758
+# CHECK-DAG: esp = 0x45464748
+# CHECK-DAG: ax = 0x0708
+# CHECK-DAG: bx = 0x1718
+# CHECK-DAG: cx = 0x2728
+# CHECK-DAG: dx = 0x3738
+# CHECK-DAG: di = 0x7778
+# CHECK-DAG: si = 0x6768
+# CHECK-DAG: bp = 0x5758
+# CHECK-DAG: sp = 0x4748
+# CHECK-DAG: ah = 0x07
+# CHECK-DAG: bh = 0x17
+# CHECK-DAG: ch = 0x27
+# CHECK-DAG: dh = 0x37
+# CHECK-DAG: al = 0x08
+# CHECK-DAG: bl = 0x18
+# CHECK-DAG: cl = 0x28
+# CHECK-DAG: dl = 0x38
+
+process continue
+# CHECK: Process {{[0-9]+}} exited with status = 0
Index: lldb/lit/Register/Inputs/x86-gp-read.cpp
===
--- /dev/null
+++ lldb/lit/Register/Inputs/x86-gp-read.cpp
@@ -0,0 +1,40 @@
+#include 
+
+int main() {
+  constexpr uint32_t eax = 0x05060708;
+  constexpr uint32_t ebx = 0x15161718;
+  constexpr uint32_t ecx = 0x25262728;
+  constexpr uint32_t edx = 0x35363738;
+  constexpr uint32_t esp = 0x45464748;
+  constexpr uint32_t ebp = 0x55565758;
+  constexpr uint32_t esi = 0x65666768;
+  constexpr uint32_t edi = 0x75767778;
+
+  asm volatile(
+// save esp & ebp
+"movd%%esp, %%mm0\n\t"
+"movd%%ebp, %%mm1\n\t"
+"\n\t"
+"movl%0, %%eax\n\t"
+"movl%1, %%ebx\n\t"
+"movl%2, %%ecx\n\t"
+"movl%3, %%edx\n\t"
+"movl%4, %%esp\n\t"
+"movl%5, %%ebp\n\t"
+"movl%6, %%esi\n\t"
+"movl%7, %%edi\n\t"
+"\n\t"
+"int3\n\t"
+"\n\t"
+// restore esp & ebp
+"movd%%mm0, %%esp\n\t"
+"movd%%mm1, %%ebp\n\t"
+:
+: "i"(eax), "i"(ebx), "i"(ecx), "i"(edx), "i"(esp), "i"(ebp), "i"(esi),
+  "i"(edi)
+: "%eax", "%ebx", "%ecx", "%edx", "%esp", "%ebp", "%esi", "%edi", "%mm0",
+  "%mm1"
+  );
+
+  return 0;
+}
Index: lldb/lit/Register/Inputs/x86-64-gp-read.cpp
===
--- /dev/null
+++ lldb/lit/Register/Inputs/x86-64-gp-read.cpp
@@ -0,0 +1,40 @@
+#include 
+
+int main() {
+  constexpr uint64_t rax = 0x0102030405060708;
+  constexpr uint64_t rbx = 0x1112131415161718;
+  constexpr uint64_t rcx = 0x2122232425262728;
+  constexpr uint64_t rdx = 0x3132333435363738;
+  constexpr uint64_t rsp = 0x4142434445464748;
+  constexpr uint64_t rbp = 0x5152535455565758;
+  constexpr uint64_t rsi = 0x6162636465666768;
+  constexpr uint64_t rdi = 0x7172737475767778;
+
+  asm volatile(
+// save rsp & rbp
+"movq%%rsp, %%r8\n\t"
+"movq%%rbp, %%r9\n\t"
+"\n\t"
+"movq

[Lldb-commits] [PATCH] D61210: [lldb] [lit] Introduce tests for reading x86 general purpose registers

2019-04-27 Thread Michał Górny via Phabricator via lldb-commits
mgorny updated this revision to Diff 196952.
mgorny added a comment.

Also included `-fomit-frame-pointer`, for CLI compatibility with gcc (i.e. in 
case clang becomes more strict in the future).


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61210/new/

https://reviews.llvm.org/D61210

Files:
  lldb/lit/Register/Inputs/x86-64-gp-read.cpp
  lldb/lit/Register/Inputs/x86-gp-read.cpp
  lldb/lit/Register/x86-64-gp-read.test
  lldb/lit/Register/x86-gp-read.test

Index: lldb/lit/Register/x86-gp-read.test
===
--- /dev/null
+++ lldb/lit/Register/x86-gp-read.test
@@ -0,0 +1,34 @@
+# XFAIL: system-windows
+# REQUIRES: native && target-x86
+# RUN: %clangxx -fomit-frame-pointer %p/Inputs/x86-gp-read.cpp -o %t
+# RUN: %lldb -b -s %s %t | FileCheck %s
+process launch
+
+register read --all
+# CHECK-DAG: eax = 0x05060708
+# CHECK-DAG: ebx = 0x15161718
+# CHECK-DAG: ecx = 0x25262728
+# CHECK-DAG: edx = 0x35363738
+# CHECK-DAG: edi = 0x75767778
+# CHECK-DAG: esi = 0x65666768
+# CHECK-DAG: ebp = 0x55565758
+# CHECK-DAG: esp = 0x45464748
+# CHECK-DAG: ax = 0x0708
+# CHECK-DAG: bx = 0x1718
+# CHECK-DAG: cx = 0x2728
+# CHECK-DAG: dx = 0x3738
+# CHECK-DAG: di = 0x7778
+# CHECK-DAG: si = 0x6768
+# CHECK-DAG: bp = 0x5758
+# CHECK-DAG: sp = 0x4748
+# CHECK-DAG: ah = 0x07
+# CHECK-DAG: bh = 0x17
+# CHECK-DAG: ch = 0x27
+# CHECK-DAG: dh = 0x37
+# CHECK-DAG: al = 0x08
+# CHECK-DAG: bl = 0x18
+# CHECK-DAG: cl = 0x28
+# CHECK-DAG: dl = 0x38
+
+process continue
+# CHECK: Process {{[0-9]+}} exited with status = 0
Index: lldb/lit/Register/x86-64-gp-read.test
===
--- /dev/null
+++ lldb/lit/Register/x86-64-gp-read.test
@@ -0,0 +1,42 @@
+# XFAIL: system-windows
+# REQUIRES: native && target-x86_64
+# RUN: %clangxx -fomit-frame-pointer %p/Inputs/x86-64-gp-read.cpp -o %t
+# RUN: %lldb -b -s %s %t | FileCheck %s
+process launch
+
+register read --all
+# CHECK-DAG: rax = 0x0102030405060708
+# CHECK-DAG: rbx = 0x1112131415161718
+# CHECK-DAG: rcx = 0x2122232425262728
+# CHECK-DAG: rdx = 0x3132333435363738
+# CHECK-DAG: rdi = 0x7172737475767778
+# CHECK-DAG: rsi = 0x6162636465666768
+# CHECK-DAG: rbp = 0x5152535455565758
+# CHECK-DAG: rsp = 0x4142434445464748
+# CHECK-DAG: eax = 0x05060708
+# CHECK-DAG: ebx = 0x15161718
+# CHECK-DAG: ecx = 0x25262728
+# CHECK-DAG: edx = 0x35363738
+# CHECK-DAG: edi = 0x75767778
+# CHECK-DAG: esi = 0x65666768
+# CHECK-DAG: ebp = 0x55565758
+# CHECK-DAG: esp = 0x45464748
+# CHECK-DAG: ax = 0x0708
+# CHECK-DAG: bx = 0x1718
+# CHECK-DAG: cx = 0x2728
+# CHECK-DAG: dx = 0x3738
+# CHECK-DAG: di = 0x7778
+# CHECK-DAG: si = 0x6768
+# CHECK-DAG: bp = 0x5758
+# CHECK-DAG: sp = 0x4748
+# CHECK-DAG: ah = 0x07
+# CHECK-DAG: bh = 0x17
+# CHECK-DAG: ch = 0x27
+# CHECK-DAG: dh = 0x37
+# CHECK-DAG: al = 0x08
+# CHECK-DAG: bl = 0x18
+# CHECK-DAG: cl = 0x28
+# CHECK-DAG: dl = 0x38
+
+process continue
+# CHECK: Process {{[0-9]+}} exited with status = 0
Index: lldb/lit/Register/Inputs/x86-gp-read.cpp
===
--- /dev/null
+++ lldb/lit/Register/Inputs/x86-gp-read.cpp
@@ -0,0 +1,40 @@
+#include 
+
+int main() {
+  constexpr uint32_t eax = 0x05060708;
+  constexpr uint32_t ebx = 0x15161718;
+  constexpr uint32_t ecx = 0x25262728;
+  constexpr uint32_t edx = 0x35363738;
+  constexpr uint32_t esp = 0x45464748;
+  constexpr uint32_t ebp = 0x55565758;
+  constexpr uint32_t esi = 0x65666768;
+  constexpr uint32_t edi = 0x75767778;
+
+  asm volatile(
+// save esp & ebp
+"movd%%esp, %%mm0\n\t"
+"movd%%ebp, %%mm1\n\t"
+"\n\t"
+"movl%0, %%eax\n\t"
+"movl%1, %%ebx\n\t"
+"movl%2, %%ecx\n\t"
+"movl%3, %%edx\n\t"
+"movl%4, %%esp\n\t"
+"movl%5, %%ebp\n\t"
+"movl%6, %%esi\n\t"
+"movl%7, %%edi\n\t"
+"\n\t"
+"int3\n\t"
+"\n\t"
+// restore esp & ebp
+"movd%%mm0, %%esp\n\t"
+"movd%%mm1, %%ebp\n\t"
+:
+: "i"(eax), "i"(ebx), "i"(ecx), "i"(edx), "i"(esp), "i"(ebp), "i"(esi),
+  "i"(edi)
+: "%eax", "%ebx", "%ecx", "%edx", "%esp", "%ebp", "%esi", "%edi", "%mm0",
+  "%mm1"
+  );
+
+  return 0;
+}
Index: lldb/lit/Register/Inputs/x86-64-gp-read.cpp
===
--- /dev/null
+++ lldb/lit/Register/Inputs/x86-64-gp-read.cpp
@@ -0,0 +1,40 @@
+#include 
+
+int main() {
+  constexpr uint64_t rax = 0x0102030405060708;
+  constexpr uint64_t rbx = 0x1112131415161718;
+  constexpr uint64_t rcx = 0x2122232425262728;
+  constexpr uint64_t rdx = 0x3132333435363738;
+  constexpr uint64_t rsp = 0x4142434445464748;
+  constexpr uint64_t rbp = 0x5152535455565758;
+  constexpr uint64_t rsi = 0x6162636465666768;
+  constexpr uint64_t rdi = 0x7172737475767778;
+
+  asm volatile(
+// save rsp & rbp
+"movq%%rsp, %%r8\n\t"
+"movq%%rbp, %%r9\n\t"
+"\n\t"
+"movq%0, %%rax\n

[Lldb-commits] [PATCH] D61221: [lldb] [lit] Introduce tests for writing x86 general-purpose registers

2019-04-27 Thread Michał Górny via Phabricator via lldb-commits
mgorny created this revision.
mgorny added reviewers: labath, JDevlieghere, krytarowski.

Introduce two initial tests for 'register write' command.  The tests
first clobber x86 general purpose registers, then call int3 to let lldb
write to them, then print the new values.  FileCheck takes care of
verifying whether correct values were written.


https://reviews.llvm.org/D61221

Files:
  lldb/lit/Register/Inputs/x86-64-gp-write.cpp
  lldb/lit/Register/Inputs/x86-gp-write.cpp
  lldb/lit/Register/x86-64-gp-write.test
  lldb/lit/Register/x86-gp-write.test

Index: lldb/lit/Register/x86-gp-write.test
===
--- /dev/null
+++ lldb/lit/Register/x86-gp-write.test
@@ -0,0 +1,26 @@
+# XFAIL: system-windows
+# REQUIRES: native && target-x86
+# RUN: %clangxx -fomit-frame-pointer %p/Inputs/x86-64-gp-read.cpp -o %t
+# RUN: %lldb -b -s %s %t | FileCheck %s
+process launch
+
+register write eax 0x01020304
+register write ebx 0x11121314
+register write ecx 0x21222324
+register write edx 0x31323334
+register write esp 0x41424344
+register write ebp 0x51525354
+register write esi 0x61626364
+register write edi 0x71727374
+
+process continue
+# CHECK-DAG: eax = 0x01020304
+# CHECK-DAG: ebx = 0x11121314
+# CHECK-DAG: ecx = 0x21222324
+# CHECK-DAG: edx = 0x31323334
+# CHECK-DAG: esp = 0x41424344
+# CHECK-DAG: ebp = 0x51525354
+# CHECK-DAG: esi = 0x61626364
+# CHECK-DAG: edi = 0x71727374
+
+# CHECK: Process {{[0-9]+}} exited with status = 0
Index: lldb/lit/Register/x86-64-gp-write.test
===
--- /dev/null
+++ lldb/lit/Register/x86-64-gp-write.test
@@ -0,0 +1,26 @@
+# XFAIL: system-windows
+# REQUIRES: native && target-x86_64
+# RUN: %clangxx -fomit-frame-pointer %p/Inputs/x86-64-gp-read.cpp -o %t
+# RUN: %lldb -b -s %s %t | FileCheck %s
+process launch
+
+register write rax 0x0102030405060708
+register write rbx 0x1112131415161718
+register write rcx 0x2122232425262728
+register write rdx 0x3132333435363738
+register write rsp 0x4142434445464748
+register write rbp 0x5152535455565758
+register write rsi 0x6162636465666768
+register write rdi 0x7172737475767778
+
+process continue
+# CHECK-DAG: rax = 0x0102030405060708
+# CHECK-DAG: rbx = 0x1112131415161718
+# CHECK-DAG: rcx = 0x2122232425262728
+# CHECK-DAG: rdx = 0x3132333435363738
+# CHECK-DAG: rsp = 0x4142434445464748
+# CHECK-DAG: rbp = 0x5152535455565758
+# CHECK-DAG: rsi = 0x6162636465666768
+# CHECK-DAG: rdi = 0x7172737475767778
+
+# CHECK: Process {{[0-9]+}} exited with status = 0
Index: lldb/lit/Register/Inputs/x86-gp-write.cpp
===
--- /dev/null
+++ lldb/lit/Register/Inputs/x86-gp-write.cpp
@@ -0,0 +1,61 @@
+#include 
+#include 
+#include 
+
+int main() {
+  constexpr uint32_t fill = 0x0F0F0F0F;
+
+  uint32_t eax, ebx, ecx, edx, esp, ebp, esi, edi;
+
+  asm volatile(
+// save esp & ebp
+"movd%%esp, %%mm0\n\t"
+"movd%%ebp, %%mm1\n\t"
+"\n\t"
+"movl%8, %%eax\n\t"
+"movl%8, %%ebx\n\t"
+"movl%8, %%ecx\n\t"
+"movl%8, %%edx\n\t"
+"movl%8, %%esp\n\t"
+"movl%8, %%ebp\n\t"
+"movl%8, %%esi\n\t"
+"movl%8, %%edi\n\t"
+"\n\t"
+"int3\n\t"
+"\n\t"
+// first save new esp & ebp, and restore their original values, so that
+// we can output values via memory
+"movd%%esp, %%mm2\n\t"
+"movd%%ebp, %%mm3\n\t"
+"movd%%mm0, %%esp\n\t"
+"movd%%mm1, %%ebp\n\t"
+"\n\t"
+// output values via memory
+"movl%%eax, %0\n\t"
+"movl%%ebx, %1\n\t"
+"movl%%ecx, %2\n\t"
+"movl%%edx, %3\n\t"
+"movl%%esi, %6\n\t"
+"movl%%edi, %7\n\t"
+"\n\t"
+// output saved esp & ebp
+"movd%%mm2, %4\n\t"
+"movd%%mm3, %5\n\t"
+: "=m"(eax), "=m"(ebx), "=m"(ecx), "=m"(edx), "=a"(esp), "=b"(ebp),
+  "=m"(esi), "=m"(edi)
+: "i"(fill)
+: "%ecx", "%edx", "%esp", "%ebp", "%esi", "%edi", "%mm0", "%mm1", "%mm2",
+  "%mm3"
+  );
+
+  printf("eax = 0x%08" PRIx32 "\n", eax);
+  printf("ebx = 0x%08" PRIx32 "\n", ebx);
+  printf("ecx = 0x%08" PRIx32 "\n", ecx);
+  printf("edx = 0x%08" PRIx32 "\n", edx);
+  printf("esp = 0x%08" PRIx32 "\n", esp);
+  printf("ebp = 0x%08" PRIx32 "\n", ebp);
+  printf("esi = 0x%08" PRIx32 "\n", esi);
+  printf("edi = 0x%08" PRIx32 "\n", edi);
+
+  return 0;
+}
Index: lldb/lit/Register/Inputs/x86-64-gp-write.cpp
===
--- /dev/null
+++ lldb/lit/Register/Inputs/x86-64-gp-write.cpp
@@ -0,0 +1,55 @@
+#include 
+#include 
+#include 
+
+int main() {
+  constexpr uint64_t fill = 0x0F0F0F0F0F0F0F0F;
+
+  uint64_t rax, rbx, rcx, rdx, rsp, rbp, rsi, rdi;
+
+  asm volatile(
+// save rsp & rbp
+"movq%%rsp, %%mm0\n\t"
+"movq%%rbp, %%mm1\n\t"
+"\n\t"
+"movq%8, %%rax\n\t"
+"movq%8, %%rbx\n\t"
+"movq%8

[Lldb-commits] [PATCH] D59485: [ASTImporter] Add an ImportImpl method to allow customizing Import behavior.

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor updated this revision to Diff 196955.
teemperor retitled this revision from "[ASTImporter] Add an ImportInternal 
method to allow customizing Import behavior." to "[ASTImporter] Add an 
ImportImpl method to allow customizing Import behavior.".
teemperor edited the summary of this revision.
teemperor added a comment.

- Added `RegisterImportedDecl` call as suggested in D59537 

- Added an assert that checks that we register any decl that an overwritten 
ImportInternal would create.
- Fixed the tests that they no longer trigger that new assert.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59485/new/

https://reviews.llvm.org/D59485

Files:
  clang/include/clang/AST/ASTImporter.h
  clang/lib/AST/ASTImporter.cpp
  clang/unittests/AST/ASTImporterTest.cpp

Index: clang/unittests/AST/ASTImporterTest.cpp
===
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -313,6 +313,14 @@
   const char *const InputFileName = "input.cc";
   const char *const OutputFileName = "output.cc";
 
+public:
+  /// Allocates an ASTImporter (or one of its subclasses).
+  typedef std::function
+  ImporterConstructor;
+
+private:
   // Buffer for the To context, must live in the test scope.
   std::string ToCode;
 
@@ -325,22 +333,33 @@
 std::unique_ptr Unit;
 TranslationUnitDecl *TUDecl = nullptr;
 std::unique_ptr Importer;
-TU(StringRef Code, StringRef FileName, ArgVector Args)
+// The lambda that constructs the ASTImporter we use in this test.
+ImporterConstructor Creator;
+TU(StringRef Code, StringRef FileName, ArgVector Args,
+   ImporterConstructor C = ImporterConstructor())
 : Code(Code), FileName(FileName),
   Unit(tooling::buildASTFromCodeWithArgs(this->Code, Args,
  this->FileName)),
-  TUDecl(Unit->getASTContext().getTranslationUnitDecl()) {
+  TUDecl(Unit->getASTContext().getTranslationUnitDecl()), Creator(C) {
   Unit->enableSourceFileDiagnostics();
+
+  // If the test doesn't need a specific ASTImporter, we just create a
+  // normal ASTImporter with it.
+  if (!Creator)
+Creator = [](ASTContext &ToContext, FileManager &ToFileManager,
+ ASTContext &FromContext, FileManager &FromFileManager,
+ bool MinimalImport, ASTImporterLookupTable *LookupTable) {
+  return new ASTImporter(ToContext, ToFileManager, FromContext,
+ FromFileManager, MinimalImport, LookupTable);
+};
 }
 
 void lazyInitImporter(ASTImporterLookupTable &LookupTable, ASTUnit *ToAST) {
   assert(ToAST);
-  if (!Importer) {
-Importer.reset(
-new ASTImporter(ToAST->getASTContext(), ToAST->getFileManager(),
-Unit->getASTContext(), Unit->getFileManager(),
-false, &LookupTable));
-  }
+  if (!Importer)
+Importer.reset(Creator(ToAST->getASTContext(), ToAST->getFileManager(),
+   Unit->getASTContext(), Unit->getFileManager(),
+   false, &LookupTable));
   assert(&ToAST->getASTContext() == &Importer->getToContext());
   createVirtualFileIfNeeded(ToAST, FileName, Code);
 }
@@ -420,11 +439,12 @@
   // Must not be called more than once within the same test.
   std::tuple
   getImportedDecl(StringRef FromSrcCode, Language FromLang, StringRef ToSrcCode,
-  Language ToLang, StringRef Identifier = DeclToImportID) {
+  Language ToLang, StringRef Identifier = DeclToImportID,
+  ImporterConstructor Creator = ImporterConstructor()) {
 ArgVector FromArgs = getArgVectorForLanguage(FromLang),
   ToArgs = getArgVectorForLanguage(ToLang);
 
-FromTUs.emplace_back(FromSrcCode, InputFileName, FromArgs);
+FromTUs.emplace_back(FromSrcCode, InputFileName, FromArgs, Creator);
 TU &FromTU = FromTUs.back();
 
 assert(!ToAST);
@@ -562,6 +582,75 @@
   EXPECT_THAT(RedeclsD1, ::testing::ContainerEq(RedeclsD2));
 }
 
+struct CustomImporter : ASTImporterOptionSpecificTestBase {};
+
+namespace {
+struct RedirectingImporter : public ASTImporter {
+  using ASTImporter::ASTImporter;
+  // ImporterConstructor that constructs this class.
+  static ASTImporterOptionSpecificTestBase::ImporterConstructor Constructor;
+
+protected:
+  llvm::Expected ImportImpl(Decl *FromD) override {
+auto *ND = dyn_cast(FromD);
+if (!ND || ND->getName() != "shouldNotBeImported")
+  return ASTImporter::ImportImpl(FromD);
+for (Decl *D : getToContext().getTranslationUnitDecl()->decls()) {
+  if (auto *ND = dyn_cast(D))
+if (ND->getName() == "realDecl") {
+  RegisterImportedDecl(FromD, ND);
+  return ND;
+}
+}
+return ASTImporter::ImportImpl(Fr

[Lldb-commits] [PATCH] D59537: Instantiate 'std' templates explicitly in the expression evaluator

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor updated this revision to Diff 196962.
teemperor edited the summary of this revision.
teemperor added a comment.

- Renamed to CxxModuleHandler as I want to reuse most of code later for decl 
importing from generic modules.
- Moved declaration construction into it's own templated method similar to the 
way the ASTImporter is handling decl construction.
- Make sure we register all created decls with the ASTImporter to prevent 
triggering the new assert in ASTImporter::Import_New(Decl *d).


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59537/new/

https://reviews.llvm.org/D59537

Files:
  lldb/include/lldb/Symbol/ClangASTContext.h
  lldb/include/lldb/Symbol/ClangASTImporter.h
  lldb/include/lldb/Symbol/CxxModuleHandler.h
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/Makefile
  
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/main.cpp
  
lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/Makefile
  
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/main.cpp
  
lldb/packages

[Lldb-commits] [PATCH] D59537: Instantiate 'std' templates explicitly in the expression evaluator

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor marked 2 inline comments as done.
teemperor added a comment.

@martong See D59485  for the new ASTImporter 
method for registering imported decls. I created the method in the ASTImporter 
as the only dependency on the ASTNodeImporter is `InitializeImportedDecl` which 
only imports more decl attributes/flags and doesn't update any internal 
ASTImporter state from what I can tell.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59537/new/

https://reviews.llvm.org/D59537



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D46551: Inject only relevant local variables in the expression evaluation context

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor commandeered this revision.
teemperor added a reviewer: friss.
teemperor added a comment.

Shafik asked me to take a look at this and see if I can fix the completion 
tests.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D46551/new/

https://reviews.llvm.org/D46551



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D46551: Inject only relevant local variables in the expression evaluation context

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor updated this revision to Diff 196965.
teemperor added a comment.

- Disable the variable filtering when during tab completion for now, as it 
seems our Clang lookup doesn't pull in external types which breaks the 
completion tests (and others too). This is only a temporary fix to unblock 
D59960 .
- Some minor cleanup and documentation.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D46551/new/

https://reviews.llvm.org/D46551

Files:
  
lldb/packages/Python/lldbsuite/test/lang/cpp/member-and-local-vars-with-same-name/TestMembersAndLocalsWithSameName.py
  lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp
  lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.h
  lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
  lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.h

Index: lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.h
===
--- lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.h
+++ lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.h
@@ -178,11 +178,12 @@
   std::vector GetModulesToImport(ExecutionContext &exe_ctx);
   void UpdateLanguageForExpr(DiagnosticManager &diagnostic_manager,
  ExecutionContext &exe_ctx,
- std::vector modules_to_import);
+ std::vector modules_to_import,
+ bool for_completion);
   bool SetupPersistentState(DiagnosticManager &diagnostic_manager,
ExecutionContext &exe_ctx);
   bool PrepareForParsing(DiagnosticManager &diagnostic_manager,
- ExecutionContext &exe_ctx);
+ ExecutionContext &exe_ctx, bool for_completion);
 
   ClangUserExpressionHelper m_type_system_helper;
 
Index: lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
===
--- lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
+++ lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
@@ -386,7 +386,7 @@
 
 void ClangUserExpression::UpdateLanguageForExpr(
 DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
-std::vector modules_to_import) {
+std::vector modules_to_import, bool for_completion) {
   m_expr_lang = lldb::LanguageType::eLanguageTypeUnknown;
 
   std::string prefix = m_expr_prefix;
@@ -407,7 +407,7 @@
 
 if (!source_code->GetText(m_transformed_text, m_expr_lang,
   m_in_static_method, exe_ctx, !m_ctx_obj,
-  modules_to_import)) {
+  for_completion, modules_to_import)) {
   diagnostic_manager.PutString(eDiagnosticSeverityError,
"couldn't construct expression body");
   return;
@@ -482,7 +482,8 @@
 }
 
 bool ClangUserExpression::PrepareForParsing(
-DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx) {
+DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
+bool for_completion) {
   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
 
   InstallContext(exe_ctx);
@@ -511,7 +512,8 @@
   LLDB_LOG(log, "List of imported modules in expression: {0}",
llvm::make_range(used_modules.begin(), used_modules.end()));
 
-  UpdateLanguageForExpr(diagnostic_manager, exe_ctx, used_modules);
+  UpdateLanguageForExpr(diagnostic_manager, exe_ctx, used_modules,
+for_completion);
   return true;
 }
 
@@ -522,7 +524,7 @@
 bool generate_debug_info) {
   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
 
-  if (!PrepareForParsing(diagnostic_manager, exe_ctx))
+  if (!PrepareForParsing(diagnostic_manager, exe_ctx, /*for_completion*/ false))
 return false;
 
   if (log)
@@ -721,7 +723,7 @@
   // correct.
   DiagnosticManager diagnostic_manager;
 
-  if (!PrepareForParsing(diagnostic_manager, exe_ctx))
+  if (!PrepareForParsing(diagnostic_manager, exe_ctx, /*for_completion*/ true))
 return false;
 
   if (log)
Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.h
===
--- lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.h
+++ lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.h
@@ -43,13 +43,14 @@
   ///evaluated.
   /// \param add_locals True iff local variables should be injected into the
   ///expression source code.
+  /// \param force_add_all_locals True iff all local variables should be
+  ///injected even if they are not used in the expression.
   /// \param modules A list of (C++) modules that the expression should import.
   ///
   /// \return true iff th

[Lldb-commits] [PATCH] D60654: Fix UNPREDICTABLE check in EmulateInstructionARM::EmulateADDRegShift

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL359387: Fix UNPREDICTABLE check in 
EmulateInstructionARM::EmulateADDRegShift (authored by teemperor, committed by 
).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D60654?vs=195025&id=196981#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D60654/new/

https://reviews.llvm.org/D60654

Files:
  lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp


Index: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
===
--- lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
+++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
@@ -10150,7 +10150,7 @@
   shift_t = DecodeRegShift(Bits32(opcode, 6, 5));
 
   // if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE;
-  if ((d == 15) || (m == 15) || (m == 15) || (s == 15))
+  if ((d == 15) || (n == 15) || (m == 15) || (s == 15))
 return false;
   break;
 


Index: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
===
--- lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
+++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
@@ -10150,7 +10150,7 @@
   shift_t = DecodeRegShift(Bits32(opcode, 6, 5));
 
   // if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE;
-  if ((d == 15) || (m == 15) || (m == 15) || (s == 15))
+  if ((d == 15) || (n == 15) || (m == 15) || (s == 15))
 return false;
   break;
 
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [lldb] r359387 - Fix UNPREDICTABLE check in EmulateInstructionARM::EmulateADDRegShift

2019-04-27 Thread Raphael Isemann via lldb-commits
Author: teemperor
Date: Sat Apr 27 11:15:35 2019
New Revision: 359387

URL: http://llvm.org/viewvc/llvm-project?rev=359387&view=rev
Log:
Fix UNPREDICTABLE check in EmulateInstructionARM::EmulateADDRegShift

Summary:
As reported in LLVM bug 41487, the check in this function is wrong and should be
the same as the described check in the comment (which is correctly copied from 
the
ARM ISA reference).

Reviewers: #lldb, davide, JDevlieghere

Reviewed By: #lldb, davide, JDevlieghere

Subscribers: davide, javed.absar, kristof.beyls, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D60654

Modified:
lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp

Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp?rev=359387&r1=359386&r2=359387&view=diff
==
--- lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp 
(original)
+++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp Sat Apr 
27 11:15:35 2019
@@ -10150,7 +10150,7 @@ bool EmulateInstructionARM::EmulateADDRe
   shift_t = DecodeRegShift(Bits32(opcode, 6, 5));
 
   // if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE;
-  if ((d == 15) || (m == 15) || (m == 15) || (s == 15))
+  if ((d == 15) || (n == 15) || (m == 15) || (s == 15))
 return false;
   break;
 


___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D57880: Add assert for 'bad' code path in GetUniqueNamespaceDeclaration

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor added a comment.

Friendly ping @shafik


Repository:
  rLLDB LLDB

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D57880/new/

https://reviews.llvm.org/D57880



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D61231: Add 'oneOf' utility function for comparing a ConstString against a set of strings

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor created this revision.
teemperor added a reviewer: JDevlieghere.
Herald added subscribers: lldb-commits, MaskRay, arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLDB.

We have a few checks in LLDB where we compare a single ConstString against a 
hardcoded list of strings. This patch introduces a
utility function 'oneOf' in ConstString which is makes this check more readable.

For example, before this patch we had to write this:

  if (ft == llvm::sys::fs::file_type::directory_file &&
  (file_spec.GetFileNameExtension() == g_sdk_suffix ||
   file_spec.GetFileNameExtension() == g_kdk_suffix)) {

And after this patch we can now write this:

  if (ft == llvm::sys::fs::file_type::directory_file &&
  file_spec.GetFileNameExtension().oneOf(g_sdk_suffix, g_kdk_suffix)) {


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D61231

Files:
  lldb/include/lldb/Utility/ConstString.h
  lldb/source/Core/Debugger.cpp
  lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
  lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp
  lldb/source/Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp
  lldb/source/Plugins/Language/ObjC/CF.cpp
  lldb/source/Plugins/Language/ObjC/Cocoa.cpp
  lldb/source/Plugins/Language/ObjC/NSDictionary.cpp
  lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
  lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
  lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
  lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
  lldb/unittests/Utility/ConstStringTest.cpp

Index: lldb/unittests/Utility/ConstStringTest.cpp
===
--- lldb/unittests/Utility/ConstStringTest.cpp
+++ lldb/unittests/Utility/ConstStringTest.cpp
@@ -137,3 +137,26 @@
   EXPECT_TRUE(null == static_cast(nullptr));
   EXPECT_TRUE(null != "bar");
 }
+
+TEST(ConstStringTest, OneOf) {
+  ConstString foo("foo");
+
+  EXPECT_TRUE(foo.oneOf("foo"));
+  EXPECT_TRUE(foo.oneOf("foo", "bar"));
+  EXPECT_TRUE(foo.oneOf("bar", "foo"));
+  EXPECT_TRUE(foo.oneOf("bar", "bar", "foo"));
+  EXPECT_TRUE(foo.oneOf("bar", "foo", "bar"));
+  EXPECT_TRUE(foo.oneOf("foo", "foo", "foo"));
+
+  EXPECT_FALSE(foo.oneOf(""));
+  EXPECT_FALSE(foo.oneOf("bar"));
+  EXPECT_FALSE(foo.oneOf("bar", ""));
+  EXPECT_FALSE(foo.oneOf("bar", "bar"));
+
+  ConstString empty("");
+  EXPECT_TRUE(empty.oneOf(""));
+  EXPECT_TRUE(empty.oneOf("foo", ""));
+  EXPECT_TRUE(empty.oneOf("foo", "", "foo"));
+  EXPECT_TRUE(empty.oneOf("foo", "", "foo"));
+  EXPECT_TRUE(empty.oneOf("foo", "foo", ""));
+}
Index: lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
===
--- lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
+++ lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp
@@ -429,8 +429,7 @@
   PlatformDarwinKernel *thisp = (PlatformDarwinKernel *)baton;
   FileSpec file_spec(path);
   if (ft == llvm::sys::fs::file_type::directory_file &&
-  (file_spec.GetFileNameExtension() == g_sdk_suffix ||
-   file_spec.GetFileNameExtension() == g_kdk_suffix)) {
+  file_spec.GetFileNameExtension().oneOf(g_sdk_suffix, g_kdk_suffix)) {
 AddRootSubdirsToSearchPaths(thisp, file_spec.GetPath());
   }
   return FileSystem::eEnumerateDirectoryResultNext;
Index: lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
===
--- lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
+++ lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
@@ -736,21 +736,18 @@
   static ConstString g_sect_name_go_symtab(".gosymtab");
   SectionType section_type = eSectionTypeOther;
   if (m_sect_headers[idx].flags & llvm::COFF::IMAGE_SCN_CNT_CODE &&
-  ((const_sect_name == g_code_sect_name) ||
-   (const_sect_name == g_CODE_sect_name))) {
+  const_sect_name.oneOf(g_code_sect_name, g_CODE_sect_name)) {
 section_type = eSectionTypeCode;
   } else if (m_sect_headers[idx].flags &
  llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA &&
- ((const_sect_name == g_data_sect_name) ||
-  (const_sect_name == g_DATA_sect_name))) {
+ const_sect_name.oneOf(g_data_sect_name, g_DATA_sect_name)) {
 if (m_sect_headers[idx].size == 0 && m_sect_headers[idx].offset == 0)
   section_type = eSectionTypeZeroFill;
 else
   section_type = eSectionTypeData;
   } else if (m_sect_headers[idx].flags &
  llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA &&
- ((const_sect_name == g_bss_sect_name) ||
-  (const_sect_name == g_BSS_sect_name))) {
+ const_sect_name.oneOf(g_bss_sect_name, g_BSS_sect_name)) {
 if (m_sect_headers[idx].size == 0)
   section_type = eSectionTypeZeroFill;
 else
Index: 

[Lldb-commits] [PATCH] D60968: WIP, RFC: Add an example of how LLDB python plug-in could look like

2019-04-27 Thread Alexander Polyakov via Phabricator via lldb-commits
apolyakov added a comment.

Gentle ping.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D60968/new/

https://reviews.llvm.org/D60968



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D61233: Refactor ObjectFile::GetSDKVersion

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor updated this revision to Diff 196987.
teemperor added a comment.

- Added documentation on the return value.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61233/new/

https://reviews.llvm.org/D61233

Files:
  lldb/include/lldb/Symbol/ObjectFile.h
  lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
  lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
  lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp


Index: lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
===
--- lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -163,8 +163,8 @@
   std::string xcode_contents_path;
   std::string default_xcode_sdk;
   FileSpec fspec;
-  uint32_t versions[2];
-  if (objfile->GetSDKVersion(versions, sizeof(versions))) {
+  llvm::Optional> versions = 
objfile->GetSDKVersion();
+  if (versions && versions->size() >= 2) {
 fspec = HostInfo::GetShlibDir();
 if (fspec) {
   std::string path;
@@ -208,8 +208,8 @@
   StreamString sdk_path;
   sdk_path.Printf("%sDeveloper/Platforms/MacOSX.platform/Developer/"
   "SDKs/MacOSX%u.%u.sdk",
-  xcode_contents_path.c_str(), versions[0],
-  versions[1]);
+  xcode_contents_path.c_str(), versions->at(0),
+  versions->at(1));
   fspec.SetFile(sdk_path.GetString(), FileSpec::Style::native);
   if (FileSystem::Instance().Exists(fspec))
 return ConstString(sdk_path.GetString());
Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
===
--- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
+++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
@@ -116,7 +116,7 @@
 
   llvm::VersionTuple GetMinimumOSVersion() override;
 
-  uint32_t GetSDKVersion(uint32_t *versions, uint32_t num_versions) override;
+  llvm::Optional> GetSDKVersion() override;
 
   bool GetIsDynamicLinkEditor() override;
 
Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
===
--- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -5846,8 +5846,7 @@
   return *m_min_os_version;
 }
 
-uint32_t ObjectFileMachO::GetSDKVersion(uint32_t *versions,
-uint32_t num_versions) {
+llvm::Optional> ObjectFileMachO::GetSDKVersion() {
   if (m_sdk_versions.empty()) {
 lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
 bool success = false;
@@ -5931,19 +5930,10 @@
   // on to m_sdk_versions.  If we only have one value, it's
   // the sentinel value indicating that this object file
   // does not have a valid minimum os version #.
-  if (m_sdk_versions.size() > 1) {
-if (versions != NULL && num_versions > 0) {
-  for (size_t i = 0; i < num_versions; ++i) {
-if (i < m_sdk_versions.size())
-  versions[i] = m_sdk_versions[i];
-else
-  versions[i] = 0;
-  }
-}
-return m_sdk_versions.size();
-  }
+  if (m_sdk_versions.size() > 1)
+return m_sdk_versions;
   // Call the superclasses version that will empty out the data
-  return ObjectFile::GetSDKVersion(versions, num_versions);
+  return ObjectFile::GetSDKVersion();
 }
 
 bool ObjectFileMachO::GetIsDynamicLinkEditor() {
Index: lldb/include/lldb/Symbol/ObjectFile.h
===
--- lldb/include/lldb/Symbol/ObjectFile.h
+++ lldb/include/lldb/Symbol/ObjectFile.h
@@ -578,14 +578,9 @@
 
   /// Get the SDK OS version this object file was built with.
   ///
-  /// The versions arguments and returns values are the same as the
-  /// GetMinimumOSVersion()
-  virtual uint32_t GetSDKVersion(uint32_t *versions, uint32_t num_versions) {
-if (versions && num_versions) {
-  for (uint32_t i = 0; i < num_versions; ++i)
-versions[i] = UINT32_MAX;
-}
-return 0;
+  /// \returns A version in the form of a vector or None on error.
+  virtual llvm::Optional> GetSDKVersion() {
+return llvm::None;
   }
 
   /// Return true if this file is a dynamic link editor (dyld)


Index: lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
===
--- lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -163,8 +163,8 @@
   std::string xcode_contents_path;
   std::string default_xcode_sdk;
   FileSpec fspec;
-  uint32_t versions[2];
-  if (objfile->GetSDKVersion(versions, sizeof(versions))) {
+  llvm::Optional> versions = objfile->GetSDKVersion();
+  if (versions && versions->size(

[Lldb-commits] [PATCH] D61233: Refactor ObjectFile::GetSDKVersion

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor created this revision.
teemperor added reviewers: aprantl, jasonmolenda.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

This patch modernizes the GetSDKVersion API and hopefully prevents problems 
such as the ones discovered in D61218 .


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D61233

Files:
  lldb/include/lldb/Symbol/ObjectFile.h
  lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
  lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
  lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp


Index: lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
===
--- lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -163,8 +163,8 @@
   std::string xcode_contents_path;
   std::string default_xcode_sdk;
   FileSpec fspec;
-  uint32_t versions[2];
-  if (objfile->GetSDKVersion(versions, sizeof(versions))) {
+  llvm::Optional> versions = 
objfile->GetSDKVersion();
+  if (versions && versions->size() >= 2) {
 fspec = HostInfo::GetShlibDir();
 if (fspec) {
   std::string path;
@@ -208,8 +208,8 @@
   StreamString sdk_path;
   sdk_path.Printf("%sDeveloper/Platforms/MacOSX.platform/Developer/"
   "SDKs/MacOSX%u.%u.sdk",
-  xcode_contents_path.c_str(), versions[0],
-  versions[1]);
+  xcode_contents_path.c_str(), versions->at(0),
+  versions->at(1));
   fspec.SetFile(sdk_path.GetString(), FileSpec::Style::native);
   if (FileSystem::Instance().Exists(fspec))
 return ConstString(sdk_path.GetString());
Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
===
--- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
+++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
@@ -116,7 +116,7 @@
 
   llvm::VersionTuple GetMinimumOSVersion() override;
 
-  uint32_t GetSDKVersion(uint32_t *versions, uint32_t num_versions) override;
+  llvm::Optional> GetSDKVersion() override;
 
   bool GetIsDynamicLinkEditor() override;
 
Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
===
--- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -5846,8 +5846,7 @@
   return *m_min_os_version;
 }
 
-uint32_t ObjectFileMachO::GetSDKVersion(uint32_t *versions,
-uint32_t num_versions) {
+llvm::Optional> ObjectFileMachO::GetSDKVersion() {
   if (m_sdk_versions.empty()) {
 lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
 bool success = false;
@@ -5931,19 +5930,10 @@
   // on to m_sdk_versions.  If we only have one value, it's
   // the sentinel value indicating that this object file
   // does not have a valid minimum os version #.
-  if (m_sdk_versions.size() > 1) {
-if (versions != NULL && num_versions > 0) {
-  for (size_t i = 0; i < num_versions; ++i) {
-if (i < m_sdk_versions.size())
-  versions[i] = m_sdk_versions[i];
-else
-  versions[i] = 0;
-  }
-}
-return m_sdk_versions.size();
-  }
+  if (m_sdk_versions.size() > 1)
+return m_sdk_versions;
   // Call the superclasses version that will empty out the data
-  return ObjectFile::GetSDKVersion(versions, num_versions);
+  return ObjectFile::GetSDKVersion();
 }
 
 bool ObjectFileMachO::GetIsDynamicLinkEditor() {
Index: lldb/include/lldb/Symbol/ObjectFile.h
===
--- lldb/include/lldb/Symbol/ObjectFile.h
+++ lldb/include/lldb/Symbol/ObjectFile.h
@@ -577,15 +577,8 @@
   }
 
   /// Get the SDK OS version this object file was built with.
-  ///
-  /// The versions arguments and returns values are the same as the
-  /// GetMinimumOSVersion()
-  virtual uint32_t GetSDKVersion(uint32_t *versions, uint32_t num_versions) {
-if (versions && num_versions) {
-  for (uint32_t i = 0; i < num_versions; ++i)
-versions[i] = UINT32_MAX;
-}
-return 0;
+  virtual llvm::Optional> GetSDKVersion() {
+return llvm::None;
   }
 
   /// Return true if this file is a dynamic link editor (dyld)


Index: lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
===
--- lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -163,8 +163,8 @@
   std::string xcode_contents_path;
   std::string default_xcode_sdk;
   FileSpec fspec;
-  uint32_t versions[2];
-  if (objfile->GetSDKVersion(versions, sizeof(versions))) {
+  llvm::Op

[Lldb-commits] [PATCH] D61233: Refactor ObjectFile::GetSDKVersion

2019-04-27 Thread Raphael Isemann via Phabricator via lldb-commits
teemperor added a comment.

I decided to go for a vector because otherwise the implementation in 
ObjectFileMachO gets a bit awkward. But I have no problem with doing a 
VersionTuple instead and adding some manual translation to version tuple in 
ObjectFileMachO.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61233/new/

https://reviews.llvm.org/D61233



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D61235: Add more information to the log timer dump

2019-04-27 Thread António Afonso via Phabricator via lldb-commits
aadsm created this revision.
aadsm added a reviewer: clayborg.
Herald added subscribers: lldb-commits, abidh, jfb, erik.pilkington, aprantl.
Herald added a project: LLDB.

The `log timer dump` is showing the time of the function itself minus any 
function that is called from this one that also happens to be timed. However, 
this is really not obvious and it also makes it hard to understand the time 
spent in total and also which children are actually taking the time.
To get a better reading of the timer dump I added the total, children (which I 
named child) and also the hit count. I used these timers to figure out a 
performance issue and only after adding this things were more clear to me.

It looks like this:

  (lldb) log timer dump
  35.447713617 sec (total: 35.449s; child: 0.001s; count: 1374) for void 
SymbolFileDWARF::Index()
  29.717921481 sec (total: 29.718s; child: 0.000s; count: 8230500) for const 
lldb_private::ConstString 
&lldb_private::Mangled::GetDemangledName(lldb::LanguageType) const
  21.049508865 sec (total: 24.683s; child: 3.633s; count: 1399) for void 
lldb_private::Symtab::InitNameIndexes()
  ...


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D61235

Files:
  lldb/include/lldb/Utility/Timer.h
  lldb/source/Utility/Timer.cpp


Index: lldb/source/Utility/Timer.cpp
===
--- lldb/source/Utility/Timer.cpp
+++ lldb/source/Utility/Timer.cpp
@@ -41,6 +41,9 @@
 
 Timer::Category::Category(const char *cat) : m_name(cat) {
   m_nanos.store(0, std::memory_order_release);
+  m_nanos_total.store(0, std::memory_order_release);
+  m_nanos_child.store(0, std::memory_order_release);
+  m_count.store(0, std::memory_order_release);
   Category *expected = g_categories;
   do {
 m_next = expected;
@@ -93,6 +96,10 @@
 
   // Keep total results for each category so we can dump results.
   m_category.m_nanos += std::chrono::nanoseconds(timer_dur).count();
+  m_category.m_nanos_total += std::chrono::nanoseconds(total_dur).count();
+  m_category.m_nanos_child +=
+  std::chrono::nanoseconds(m_child_duration).count();
+  m_category.m_count++;
 }
 
 void Timer::SetDisplayDepth(uint32_t depth) { g_display_depth = depth; }
@@ -101,24 +108,38 @@
  * - returns whether a person is less than another person
  */
 
-typedef std::pair TimerEntry;
+struct Stats {
+  uint64_t nanos;
+  uint64_t nanos_total;
+  uint64_t nanos_child;
+  uint64_t count;
+};
+typedef std::pair TimerEntry;
 
 static bool CategoryMapIteratorSortCriterion(const TimerEntry &lhs,
  const TimerEntry &rhs) {
-  return lhs.second > rhs.second;
+  return lhs.second.nanos > rhs.second.nanos;
 }
 
 void Timer::ResetCategoryTimes() {
-  for (Category *i = g_categories; i; i = i->m_next)
+  for (Category *i = g_categories; i; i = i->m_next) {
 i->m_nanos.store(0, std::memory_order_release);
+i->m_nanos_total.store(0, std::memory_order_release);
+i->m_nanos_child.store(0, std::memory_order_release);
+i->m_count.store(0, std::memory_order_release);
+  }
 }
 
 void Timer::DumpCategoryTimes(Stream *s) {
   std::vector sorted;
   for (Category *i = g_categories; i; i = i->m_next) {
 uint64_t nanos = i->m_nanos.load(std::memory_order_acquire);
+uint64_t nanos_total = i->m_nanos_total.load(std::memory_order_acquire);
+uint64_t nanos_child = i->m_nanos_child.load(std::memory_order_acquire);
+uint64_t count = i->m_count.load(std::memory_order_acquire);
+Stats stats{nanos, nanos_total, nanos_child, count};
 if (nanos)
-  sorted.push_back(std::make_pair(i->m_name, nanos));
+  sorted.push_back(std::make_pair(i->m_name, stats));
   }
   if (sorted.empty())
 return; // Later code will break without any elements.
@@ -127,5 +148,9 @@
   llvm::sort(sorted.begin(), sorted.end(), CategoryMapIteratorSortCriterion);
 
   for (const auto &timer : sorted)
-s->Printf("%.9f sec for %s\n", timer.second / 10., timer.first);
+s->Printf("%.9f sec (total: %.3fs; child: %.3fs; count: %llu) for %s\n",
+  timer.second.nanos / 10.,
+  timer.second.nanos_total / 10.,
+  timer.second.nanos_child / 10., timer.second.count,
+  timer.first);
 }
Index: lldb/include/lldb/Utility/Timer.h
===
--- lldb/include/lldb/Utility/Timer.h
+++ lldb/include/lldb/Utility/Timer.h
@@ -30,6 +30,9 @@
 friend class Timer;
 const char *m_name;
 std::atomic m_nanos;
+std::atomic m_nanos_total;
+std::atomic m_nanos_child;
+std::atomic m_count;
 std::atomic m_next;
 
 DISALLOW_COPY_AND_ASSIGN(Category);


Index: lldb/source/Utility/Timer.cpp
===
--- lldb/source/Utility/Timer.cpp
+++ lldb/source/Utility/Timer.cpp
@@ -41,6 +41,9 @@
 
 Timer::Category::Category(const char *cat) : m_name(cat) {
   m_nanos.sto