summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite
diff options
context:
space:
mode:
authorJason Molenda <jmolenda@apple.com>2018-03-06 00:27:41 +0000
committerJason Molenda <jmolenda@apple.com>2018-03-06 00:27:41 +0000
commita1bd9508e02c9c59dff0962e15abbbd1e0e677b7 (patch)
treeccedb9df015535f516654f6d3097b3da629e523c /lldb/packages/Python/lldbsuite
parent15e814f687e42c3bc41e6454c86087eb3373d39f (diff)
downloadbcm5719-llvm-a1bd9508e02c9c59dff0962e15abbbd1e0e677b7.tar.gz
bcm5719-llvm-a1bd9508e02c9c59dff0962e15abbbd1e0e677b7.zip
Upstreaming avx512 register support in debugserver. These changes
were originally written by Chris Bieneman, they've undergone a number of changes since then. Also including the debugserver bridgeos support, another arm environment that runs Darwin akin to ios. These codepaths are activated when running in a bridgeos environment which we're not set up to test today. There's additional (small) lldb changes to handle bridgeos binaries that still need to be merged up. Tested on a darwin system with avx512 hardware and without. <rdar://problem/36424951> llvm-svn: 326756
Diffstat (limited to 'lldb/packages/Python/lldbsuite')
-rw-r--r--lldb/packages/Python/lldbsuite/test/decorators.py18
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestYMMRegister.py8
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestZMMRegister.py126
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/main.c108
4 files changed, 241 insertions, 19 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/decorators.py b/lldb/packages/Python/lldbsuite/test/decorators.py
index f67681d7a0f..38379379504 100644
--- a/lldb/packages/Python/lldbsuite/test/decorators.py
+++ b/lldb/packages/Python/lldbsuite/test/decorators.py
@@ -10,6 +10,7 @@ import platform
import re
import sys
import tempfile
+import subprocess
# Third-party modules
import six
@@ -741,3 +742,20 @@ def skipIfXmlSupportMissing(func):
fail_value = True # More likely to notice if something goes wrong
have_xml = xml.GetValueForKey("value").GetBooleanValue(fail_value)
return unittest2.skipIf(not have_xml, "requires xml support")(func)
+
+# Call sysctl on darwin to see if a specified hardware feature is available on this machine.
+def skipUnlessFeature(feature):
+ def is_feature_enabled(self):
+ if platform.system() == 'Darwin':
+ try:
+ DEVNULL = open(os.devnull, 'w')
+ output = subprocess.check_output(["/usr/sbin/sysctl", feature], stderr=DEVNULL)
+ # If 'feature: 1' was output, then this feature is available and
+ # the test should not be skipped.
+ if re.match('%s: 1\s*' % feature, output):
+ return None
+ else:
+ return "%s is not supported on this system." % feature
+ except subprocess.CalledProcessError:
+ return "%s is not supported on this system." % feature
+ return skipTestIfFn(is_feature_enabled)
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestYMMRegister.py b/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestYMMRegister.py
index d4249694c9b..0f497536e41 100644
--- a/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestYMMRegister.py
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestYMMRegister.py
@@ -21,8 +21,9 @@ class TestYMMRegister(TestBase):
@skipIfiOSSimulator
@skipIfTargetAndroid()
@skipIf(archs=no_match(['i386', 'x86_64']))
+ @expectedFailureAll(oslist=["linux"], bugnumber="rdar://30523153")
def test(self):
- self.build()
+ self.build(dictionary={"CFLAGS_EXTRAS": "-march=haswell"})
self.setTearDownCleanup()
exe = self.getBuildArtifact("a.out")
@@ -56,9 +57,10 @@ class TestYMMRegister(TestBase):
else:
register_range = 8
for i in range(register_range):
+ j = i - ((i / 8) * 8)
self.runCmd("thread step-inst")
- register_byte = (byte_pattern1 | i)
+ register_byte = (byte_pattern1 | j)
pattern = "ymm" + str(i) + " = " + str('{') + (
str(hex(register_byte)) + ' ') * 31 + str(hex(register_byte)) + str('}')
@@ -66,7 +68,7 @@ class TestYMMRegister(TestBase):
"register read ymm" + str(i),
substrs=[pattern])
- register_byte = (byte_pattern2 | i)
+ register_byte = (byte_pattern2 | j)
pattern = "ymm" + str(i) + " = " + str('{') + (
str(hex(register_byte)) + ' ') * 31 + str(hex(register_byte)) + str('}')
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestZMMRegister.py b/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestZMMRegister.py
new file mode 100644
index 00000000000..823e40155ff
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/TestZMMRegister.py
@@ -0,0 +1,126 @@
+"""
+Test that we correctly read the YMM registers.
+"""
+
+from __future__ import print_function
+
+
+import os
+import time
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestYMMRegister(TestBase):
+ mydir = TestBase.compute_mydir(__file__)
+ NO_DEBUG_INFO_TESTCASE = True
+
+ @skipUnlessDarwin
+ @skipIfiOSSimulator
+ @skipIf(archs=no_match(['i386', 'x86_64']))
+ @debugserver_test
+ @skipUnlessFeature('hw.optional.avx512f')
+ def test(self):
+ self.build(dictionary={"CFLAGS_EXTRAS": "-mavx512f"})
+ self.setTearDownCleanup()
+
+ exe = self.getBuildArtifact("a.out")
+ target = self.dbg.CreateTarget(exe)
+
+ self.assertTrue(target, VALID_TARGET)
+
+ byte_pattern1 = 0x80
+ byte_pattern2 = 0xFF
+
+ # This test is working with assembly instructions; it'll make
+ # it easier to debug the console output if the assembly is
+ # displayed.
+ self.runCmd("settings set stop-disassembly-display always")
+
+ # Launch the process and stop.
+ self.expect("run", PROCESS_STOPPED, substrs=['stopped'])
+
+ # Check stop reason; Should be either signal SIGTRAP or EXC_BREAKPOINT
+ output = self.res.GetOutput()
+ matched = False
+ substrs = [
+ 'stop reason = EXC_BREAKPOINT',
+ 'stop reason = signal SIGTRAP']
+ for str1 in substrs:
+ matched = output.find(str1) != -1
+ with recording(self, False) as sbuf:
+ print("%s sub string: %s" % ('Expecting', str1), file=sbuf)
+ print("Matched" if matched else "Not Matched", file=sbuf)
+ if matched:
+ break
+ self.assertTrue(matched, STOPPED_DUE_TO_SIGNAL)
+
+ if self.getArchitecture() == 'x86_64':
+ register_range = 16
+ else:
+ register_range = 8
+ for i in range(register_range):
+ j = i - ((i / 8) * 8)
+ self.runCmd("thread step-inst")
+
+ register_byte = (byte_pattern1 | j)
+ pattern = "ymm" + str(i) + " = " + str('{') + (
+ str(hex(register_byte)) + ' ') * 31 + str(hex(register_byte)) + str('}')
+
+ self.expect(
+ "register read ymm" + str(i),
+ substrs=[pattern])
+
+ register_byte = (byte_pattern2 | j)
+ pattern = "ymm" + str(i) + " = " + str('{') + (
+ str(hex(register_byte)) + ' ') * 31 + str(hex(register_byte)) + str('}')
+
+ self.runCmd("thread step-inst")
+ self.expect(
+ "register read ymm" + str(i),
+ substrs=[pattern])
+
+ self.expect("continue", PROCESS_STOPPED, substrs=['stopped'])
+
+ # Check stop reason; Should be either signal SIGTRAP or EXC_BREAKPOINT
+ output = self.res.GetOutput()
+ matched = False
+ substrs = [
+ 'stop reason = EXC_BREAKPOINT',
+ 'stop reason = signal SIGTRAP']
+ for str1 in substrs:
+ matched = output.find(str1) != -1
+ with recording(self, False) as sbuf:
+ print("%s sub string: %s" % ('Expecting', str1), file=sbuf)
+ print("Matched" if matched else "Not Matched", file=sbuf)
+ if matched:
+ break
+ self.assertTrue(matched, STOPPED_DUE_TO_SIGNAL)
+
+ if self.getArchitecture() == 'x86_64':
+ register_range = 32
+ else:
+ register_range = 8
+ for i in range(register_range):
+ j = i - ((i / 8) * 8)
+ self.runCmd("thread step-inst")
+ self.runCmd("thread step-inst")
+
+ register_byte = (byte_pattern2 | j)
+ pattern = "zmm" + str(i) + " = " + str('{') + (
+ str(hex(register_byte)) + ' ') * 63 + str(hex(register_byte)) + str('}')
+
+ self.expect(
+ "register read zmm" + str(i),
+ substrs=[pattern])
+
+ register_byte = (byte_pattern2 | j)
+ pattern = "zmm" + str(i) + " = " + str('{') + (
+ str(hex(register_byte)) + ' ') * 63 + str(hex(register_byte)) + str('}')
+
+ self.runCmd("thread step-inst")
+ self.expect(
+ "register read zmm" + str(i),
+ substrs=[pattern])
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/main.c b/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/main.c
index 4cfb2239c06..671331fe450 100644
--- a/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/main.c
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/register/intel_avx/main.c
@@ -9,15 +9,14 @@
void func() {
unsigned int ymmvalues[16];
- unsigned char val;
- unsigned char i;
- for (i = 0 ; i < 16 ; i++)
+ for (int i = 0 ; i < 16 ; i++)
{
- val = (0x80 | i);
+ unsigned char val = (0x80 | i);
ymmvalues[i] = (val << 24) | (val << 16) | (val << 8) | val;
}
unsigned int ymmallones = 0xFFFFFFFF;
+#if defined(__AVX__)
__asm__("int3;"
"vbroadcastss %1, %%ymm0;"
"vbroadcastss %0, %%ymm0;"
@@ -36,32 +35,109 @@ void func() {
"vbroadcastss %8, %%ymm7;"
"vbroadcastss %0, %%ymm7;"
#if defined(__x86_64__)
- "vbroadcastss %9, %%ymm8;"
+ "vbroadcastss %1, %%ymm8;"
"vbroadcastss %0, %%ymm8;"
- "vbroadcastss %10, %%ymm9;"
+ "vbroadcastss %2, %%ymm9;"
"vbroadcastss %0, %%ymm9;"
- "vbroadcastss %11, %%ymm10;"
+ "vbroadcastss %3, %%ymm10;"
"vbroadcastss %0, %%ymm10;"
- "vbroadcastss %12, %%ymm11;"
+ "vbroadcastss %4, %%ymm11;"
"vbroadcastss %0, %%ymm11;"
- "vbroadcastss %13, %%ymm12;"
+ "vbroadcastss %5, %%ymm12;"
"vbroadcastss %0, %%ymm12;"
- "vbroadcastss %14, %%ymm13;"
+ "vbroadcastss %6, %%ymm13;"
"vbroadcastss %0, %%ymm13;"
- "vbroadcastss %15, %%ymm14;"
+ "vbroadcastss %7, %%ymm14;"
"vbroadcastss %0, %%ymm14;"
- "vbroadcastss %16, %%ymm15;"
+ "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__)
- ,
- "m"(ymmvalues[8]), "m"(ymmvalues[9]), "m"(ymmvalues[10]), "m"(ymmvalues[11]),
- "m"(ymmvalues[12]), "m"(ymmvalues[13]), "m"(ymmvalues[14]), "m"(ymmvalues[15])
+ "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;"
+ "vbroadcastss %1, %%zmm16;"
+ "vbroadcastss %0, %%zmm16;"
+ "vbroadcastss %2, %%zmm17;"
+ "vbroadcastss %0, %%zmm17;"
+ "vbroadcastss %3, %%zmm18;"
+ "vbroadcastss %0, %%zmm18;"
+ "vbroadcastss %4, %%zmm19;"
+ "vbroadcastss %0, %%zmm19;"
+ "vbroadcastss %5, %%zmm20;"
+ "vbroadcastss %0, %%zmm20;"
+ "vbroadcastss %6, %%zmm21;"
+ "vbroadcastss %0, %%zmm21;"
+ "vbroadcastss %7, %%zmm22;"
+ "vbroadcastss %0, %%zmm22;"
+ "vbroadcastss %8, %%zmm23;"
+ "vbroadcastss %0, %%zmm23;"
+ "vbroadcastss %1, %%zmm24;"
+ "vbroadcastss %0, %%zmm24;"
+ "vbroadcastss %2, %%zmm25;"
+ "vbroadcastss %0, %%zmm25;"
+ "vbroadcastss %3, %%zmm26;"
+ "vbroadcastss %0, %%zmm26;"
+ "vbroadcastss %4, %%zmm27;"
+ "vbroadcastss %0, %%zmm27;"
+ "vbroadcastss %5, %%zmm28;"
+ "vbroadcastss %0, %%zmm28;"
+ "vbroadcastss %6, %%zmm29;"
+ "vbroadcastss %0, %%zmm29;"
+ "vbroadcastss %7, %%zmm30;"
+ "vbroadcastss %0, %%zmm30;"
+ "vbroadcastss %8, %%zmm31;"
+ "vbroadcastss %0, %%zmm31;"
+#endif
+ ::"m"(ymmallones),
+ "m"(zmmvalues[0]), "m"(zmmvalues[1]), "m"(zmmvalues[2]), "m"(zmmvalues[3]),
+ "m"(zmmvalues[4]), "m"(zmmvalues[5]), "m"(zmmvalues[6]), "m"(zmmvalues[7])
+ );
#endif
- );
}
int main(int argc, char const *argv[]) { func(); }
OpenPOWER on IntegriCloud