From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by sourceware.org (Postfix) with ESMTPS id 0F6B7383128F for ; Wed, 25 May 2022 22:37:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0F6B7383128F Received: from pps.filterd (m0187473.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 24PLFUqu004707; Wed, 25 May 2022 22:37:23 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3g9v7094c7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 25 May 2022 22:37:23 +0000 Received: from m0187473.ppops.net (m0187473.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 24PMVerT039203; Wed, 25 May 2022 22:37:22 GMT Received: from ppma02fra.de.ibm.com (47.49.7a9f.ip4.static.sl-reverse.com [159.122.73.71]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3g9v7094bw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 25 May 2022 22:37:22 +0000 Received: from pps.filterd (ppma02fra.de.ibm.com [127.0.0.1]) by ppma02fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 24PMbKqp018794; Wed, 25 May 2022 22:37:20 GMT Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by ppma02fra.de.ibm.com with ESMTP id 3g9s6m88w8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 25 May 2022 22:37:20 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 24PMbF9J19530146 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 May 2022 22:37:15 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BDF3CA405E; Wed, 25 May 2022 22:37:15 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5DE6EA4057; Wed, 25 May 2022 22:37:15 +0000 (GMT) Received: from heavy.lan (unknown [9.171.15.184]) by d06av23.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 25 May 2022 22:37:15 +0000 (GMT) From: Ilya Leoshkevich To: Tom Tromey Cc: Ulrich Weigand , Andreas Arnez , Andrew Burgess , Pedro Alves , gdb-patches@sourceware.org, Ilya Leoshkevich Subject: [PATCH 5/5] gdb.perf/: Add JIT performance test Date: Thu, 26 May 2022 00:37:11 +0200 Message-Id: <20220525223711.845475-6-iii@linux.ibm.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20220525223711.845475-1-iii@linux.ibm.com> References: <20220525223711.845475-1-iii@linux.ibm.com> X-TM-AS-GCONF: 00 X-Proofpoint-GUID: JeBFrm7N1dLBVtweZa-SA5TzzMUFwaNh X-Proofpoint-ORIG-GUID: oNDlKbK3d_wrK6NgHSJFFIl6qxQT4ijz Content-Transfer-Encoding: 8bit X-Proofpoint-UnRewURL: 0 URL was un-rewritten MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.874,Hydra:6.0.486,FMLib:17.11.64.514 definitions=2022-05-25_06,2022-05-25_02,2022-02-23_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 malwarescore=0 phishscore=0 adultscore=0 suspectscore=0 bulkscore=0 mlxscore=0 lowpriorityscore=0 clxscore=1015 mlxlogscore=999 priorityscore=1501 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2204290000 definitions=main-2205250104 X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 May 2022 22:37:28 -0000 The test registers and unregisters 500 functions. The time it takes to process each function (the more functions there are, the slower it is) is written into a global array, which is then read and reported by the GDB script. --- gdb/testsuite/gdb.perf/jit-check.exp | 25 ++++++++ gdb/testsuite/gdb.perf/jit-check.py | 60 ++++++++++++++++++++ gdb/testsuite/gdb.perf/jit-solib.c | 28 +++++++++ gdb/testsuite/gdb.perf/jit.c | 85 ++++++++++++++++++++++++++++ gdb/testsuite/gdb.perf/jit.exp | 37 ++++++++++++ 5 files changed, 235 insertions(+) create mode 100644 gdb/testsuite/gdb.perf/jit-check.exp create mode 100644 gdb/testsuite/gdb.perf/jit-check.py create mode 100644 gdb/testsuite/gdb.perf/jit-solib.c create mode 100644 gdb/testsuite/gdb.perf/jit.c create mode 100644 gdb/testsuite/gdb.perf/jit.exp diff --git a/gdb/testsuite/gdb.perf/jit-check.exp b/gdb/testsuite/gdb.perf/jit-check.exp new file mode 100644 index 00000000000..c124f294f7b --- /dev/null +++ b/gdb/testsuite/gdb.perf/jit-check.exp @@ -0,0 +1,25 @@ +# Copyright (C) 2022 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Benchmark registering and unregistering JITed code (run part). + +load_lib perftest.exp +load_lib gen-perf-test.exp + +if [skip_perf_tests] { + return 0 +} + +GenPerfTest::standard_run_driver jit.exp make_testcase_config jit-check.py JitCheck diff --git a/gdb/testsuite/gdb.perf/jit-check.py b/gdb/testsuite/gdb.perf/jit-check.py new file mode 100644 index 00000000000..c5b46a23ffc --- /dev/null +++ b/gdb/testsuite/gdb.perf/jit-check.py @@ -0,0 +1,60 @@ +# Copyright (C) 2022 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Benchmark for registering and unregistering JITed code. + +import os +import shlex + +from perftest import measure +from perftest import perftest +from perftest import testresult +from perftest import utils + + +class JitCheck(perftest.TestCaseWithBasicMeasurements): + def __init__(self, name, run_names, binfile): + super(JitCheck, self).__init__(name) + self.run_names = run_names + self.binfile = binfile + self.measurement = measure.MeasurementWallTime( + testresult.SingleStatisticTestResult() + ) + self.measure.measurements.append(self.measurement) + + def warm_up(self): + pass + + def execute_test(self): + for run in self.run_names: + exe = "{}-{}".format(self.binfile, utils.convert_spaces(run)) + utils.select_file(exe) + + # Help the binary find the shared objects. + pieces = os.path.join(os.path.dirname(exe), "pieces") + gdb.execute("cd {}".format(shlex.quote(pieces))) + + # Measure the total run time. + utils.runto_main() + gdb.execute("tbreak done_breakpoint") + self.measure.measure(lambda: gdb.execute("continue"), run) + + # Extract and record processing times for individual functions. + for array_name in ("register_times", "unregister_times"): + array_value = gdb.parse_and_eval(array_name) + for i in range(*array_value.type.range()): + parameter = "{}:{}:{}".format(run, array_name, i + 1) + result = int(array_value[i]) / 1e6 + self.measurement.result.record(parameter, result) diff --git a/gdb/testsuite/gdb.perf/jit-solib.c b/gdb/testsuite/gdb.perf/jit-solib.c new file mode 100644 index 00000000000..1171f1b86da --- /dev/null +++ b/gdb/testsuite/gdb.perf/jit-solib.c @@ -0,0 +1,28 @@ +/* This test program is part of GDB, the GNU debugger. + + Copyright (C) 2022 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Shared object for benchmarking registering and unregistering JITed code. + It is simply copied into memory, so there should be no relocations. + Must be compiled with -DSHLIB=. */ + +#define CAT_1(x, y) x##y +#define CAT(x, y) CAT_1 (x, y) +int +CAT (jited_func_, SHLIB) (void) +{ + return SHLIB; +} diff --git a/gdb/testsuite/gdb.perf/jit.c b/gdb/testsuite/gdb.perf/jit.c new file mode 100644 index 00000000000..7fc8b4a6339 --- /dev/null +++ b/gdb/testsuite/gdb.perf/jit.c @@ -0,0 +1,85 @@ +/* This test program is part of GDB, the GNU debugger. + + Copyright (C) 2022 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Benchmark for registering and unregistering JITed code. + Must be compiled with -DSHLIB=. */ + +#include "../gdb.base/jit-elf-util.h" +#include "../gdb.base/jit-protocol-util.h" +#include +#include + +static struct jit_code_entry entries[SHLIB]; +static uint64_t register_times[SHLIB]; +static uint64_t unregister_times[SHLIB]; + +static uint64_t +time_delta (struct timeval *start_time) +{ + struct timeval end_time; + + gettimeofday (&end_time, NULL); + return (uint64_t)(end_time.tv_sec - start_time->tv_sec) * 1000000 + + (end_time.tv_usec - start_time->tv_usec); +} + +void __attribute__ ((noinline)) done_breakpoint (void) {} + +int +main (void) +{ + struct timeval start_time; + int i; + + /* Load and register shared libraries. */ + for (i = 0; i < SHLIB; i++) + { + int (*jited_func) (void); + size_t obj_size; + char name[32]; + void *addr; + + sprintf (name, "jit-lib%d.so", i); + addr = load_elf (name, &obj_size, NULL); + sprintf (name, "jited_func_%d", i); + jited_func = addr + (uintptr_t)load_symbol (addr, name); + + entries[i].symfile_addr = addr; + entries[i].symfile_size = obj_size; + gettimeofday (&start_time, NULL); + jit_push_back (&entries[i]); + register_times[i] = time_delta (&start_time); + + if (jited_func () != i) + { + fprintf (stderr, "jited_func_%d () != %d\n", i, i); + return 1; + } + } + + /* Now unregister them all in reverse order. */ + for (i = SHLIB - 1; i >= 0; i--) + { + gettimeofday (&start_time, NULL); + jit_pop_back (); + unregister_times[i] = time_delta (&start_time); + } + + done_breakpoint (); + + return 0; +} diff --git a/gdb/testsuite/gdb.perf/jit.exp b/gdb/testsuite/gdb.perf/jit.exp new file mode 100644 index 00000000000..02923b290d9 --- /dev/null +++ b/gdb/testsuite/gdb.perf/jit.exp @@ -0,0 +1,37 @@ +# Copyright (C) 2022 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Benchmark registering and unregistering JITed code (build part). + +load_lib perftest.exp +load_lib gen-perf-test.exp + +if [skip_perf_tests] { + return 0 +} + +proc make_testcase_config { } { + set program_name "jit" + array set testcase [GenPerfTest::init_testcase $program_name] + set testcase(language) c + set testcase(binary_extra_sources) { { jit.c } } + set testcase(binary_link_with_shlibs) { 0 } + set testcase(gen_shlib_extra_sources) { { jit-solib.c } } + set testcase(run_names) { 500-sos } + set testcase(nr_gen_shlibs) { 500 } + return [array get testcase] +} + +GenPerfTest::standard_compile_driver jit.exp make_testcase_config -- 2.35.3