From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 797AF3858C50 for ; Thu, 16 Nov 2023 11:32:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 797AF3858C50 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 797AF3858C50 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700134381; cv=none; b=d43Q1BWqfIz/96YmiZOGPqakKh66SSptfcbDiHf/Or38bUolcBMt3qXtj70PEGaBVg2PAc0bNp/vPvW7qdPpj/M8SfAukXN7Q7N6wPyHkMDwbSH/HcIRkqE0/fUp6S8zUV/EHllQfoT3gUN+dZiOpWet3W2JxjZwoobT3CqTFXQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700134381; c=relaxed/simple; bh=5D4WTXWTte1cM+DFzEhtZZ8yNrhEZN7PB3wPGjsnyUo=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=S3as7NcbZCIFN76tlDKrGBpwX6iC8+r0luGxNdua7XS2+rDcTzTZK+Vqx6xyqcVgJDsIMBXXKLqYnfavGI6QuW1jE3jumwb+ZnoCu15rQqNNbBfrGZrLuWjF4pMvZXRJ6iwGuxO4zrfBjqJZnbBDPs6oJxJG9sdsydxBwTHB2y4= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1700134378; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=0uwTLe7g59zljPSJNWK+095DwlBtwjj+eS7QqVrTBwY=; b=JsBStUIWe4u8UzozGJEohTXExrbqBhnxpPccaD1EE7RYUhkaKyaCuzjAFgpSV8tTUUO5Z7 klt7vyGcZL7OZ0ZhDwnlzfqItFVYam29tSehJjkODtB7+cVFdaFCv4e05VUu/0F0nH24GY 614wZuiuKN48XsaxOta9jcOaoYWDqRg= Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-244-b_P6XxYHO7u29ApsT_XXvA-1; Thu, 16 Nov 2023 06:32:57 -0500 X-MC-Unique: b_P6XxYHO7u29ApsT_XXvA-1 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-32f7cfab43eso333577f8f.1 for ; Thu, 16 Nov 2023 03:32:56 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700134375; x=1700739175; h=mime-version:message-id:date:references:in-reply-to:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=0uwTLe7g59zljPSJNWK+095DwlBtwjj+eS7QqVrTBwY=; b=vwcnFOILbU5+O+wR+T6nHLS3QL9Se7oa+9dY3SxZ1eQpW1VN+ZGpkZ6jLnizLC9Hdh CLM0RGvcqEu3DDYjerWPThYC2oOpIly5rLLwMKiE2hN7ZcgA6WZrKD6oUj6V/HXFDAUs E0ycfE+oh4rwf5r8vWj/QwAGHcdMpvwxErRKAatcKx7WnnJEhG+CTFzY/YVwYrqVsVMg kpu06Hb1RuMUWFI1pyKkfkfSn8bRqqjRzxphQBh+n8Kbg3KEM3gyvanM8SnAkf4iXigR 5irkT6oyO7sBerIzwcO1jYm/WxX8VxT/NajRBzb8HcCqFnsZFkt+WgtNauW5p1pxp397 c8NQ== X-Gm-Message-State: AOJu0Yx6NWNPze30UW/ghcF0cgWD60mR0mDFS1BEEYqOUc+lc8ni688q QqpmfaWjEsqArF9yU3VCegnfBVHaZf/p122CXMaakJc+13f+0gXbTCoPWDn3npWAP93vHYUl8Gj KxqHrWidutWpDhWFIXwtaeskGq4BZtQ== X-Received: by 2002:a05:6000:1565:b0:32f:7ebe:3e5a with SMTP id 5-20020a056000156500b0032f7ebe3e5amr13360250wrz.50.1700134375281; Thu, 16 Nov 2023 03:32:55 -0800 (PST) X-Google-Smtp-Source: AGHT+IGi1JtSCVLgYvOmQ6FI+yiioB0Gmf/z5c6TXwPtstAwqyAQiWqYGl6OsGIiOvA+WQgoAROA9w== X-Received: by 2002:a05:6000:1565:b0:32f:7ebe:3e5a with SMTP id 5-20020a056000156500b0032f7ebe3e5amr13360220wrz.50.1700134374767; Thu, 16 Nov 2023 03:32:54 -0800 (PST) Received: from localhost (105.226.159.143.dyn.plus.net. [143.159.226.105]) by smtp.gmail.com with ESMTPSA id m4-20020a056000024400b0032fb0e2087asm13219178wrz.82.2023.11.16.03.32.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Nov 2023 03:32:54 -0800 (PST) From: Andrew Burgess To: Tankut Baris Aktemur , gdb-patches@sourceware.org Cc: blarsen@redhat.com, tom@tromey.com Subject: Re: [PATCH v4] gdb, python: selectively omit enabling stdin in gdb.execute In-Reply-To: References: <20230331081114.1319992-1-tankut.baris.aktemur@intel.com> Date: Thu, 16 Nov 2023 11:32:53 +0000 Message-ID: <877cmiq6fu.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,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 List-Id: Tankut Baris Aktemur writes: Hi Baris, I took a look through this patch. I have a few thoughts. > ========= > > Hi, > > The previous revision (v3) of this patch can be found at > > https://sourceware.org/pipermail/gdb-patches/2023-March/198508.html > > Changes in this version: > > * Rebased on the current master. > * Added a new test scenario in gdb.python/py-cmd-prompt.exp. > * The new scenario made me add a new boolean field to `struct ui` in ui.h. > > Regards, > Baris > > ========= > > From the Python API, we can execute GDB commands via gdb.execute. If > the command gives an exception, however, we need to recover the GDB > prompt and enable stdin, because the exception does not reach > top-level GDB or normal_stop. This was done in commit > > commit 1ba1ac88011703abcd0271e4f5d00927dc69a09a > Author: Andrew Burgess > Date: Tue Nov 19 11:17:20 2019 +0000 > > gdb: Enable stdin on exception in execute_gdb_command > > However, we face a glitch if the Python side executes the command in a > context where GDB had already disabled stdin, because it was running a > synchronous execution command such as "continue" or "run". As an > example, suppose we have the following objfile event listener, > specified in a file named file.py: > > ~~~ > import gdb > > class MyListener: > def __init__(self): > gdb.events.new_objfile.connect(self.handle_new_objfile_event) > self.processed_objfile = False > > def handle_new_objfile_event(self, event): > if self.processed_objfile: > return > > print("loading " + event.new_objfile.filename) > self.processed_objfile = True > gdb.execute("print a") > > the_listener = MyListener() > ~~~ > > The executed command "print a", gives an error because "a" is not > defined. We use the listener as follows: > > $ gdb -q -ex "source file.py" -ex "run" --args a.out > Reading symbols from /tmp/a.out... > Starting program: /tmp/a.out > loading /lib64/ld-linux-x86-64.so.2 > Python Exception : No symbol "a" in current context. > (gdb) [Inferior 1 (process 3980401) exited normally] > > Note how the GDB prompt comes inbetween the exception message and the > inferior's exit message. We have this obscure behavior, because GDB > continues to execute its flow after emitting the Python event. In > this case, GDB would enable stdin in the normal way. Hence, we do not > need to explicitly enable stdin in execute_gdb_command when an > exception occurs. > > A similar problem occurs also when the command completes without > exception, but if it enables stdin upon completion. The "target > remote" command is an example for such case. For more details of the > scenario, see the test case added by this patch. First, thanks for digging into this problem more since v3 and finding the additional case that justifies the approach taken here. However, I think that the commit message is showing the legacy of the original problem. When I first read through this, my first thought was still exactly what Tom suggested (I hadn't looked at v3 at this point); that we should record if the prompt is blocked inside execute_gdb_command instead of adding the new ui member variable. You say "A similar problem occurs also ... " and yes, the outcome is the same (early prompt), but really I think this is a totally different problem which defines _why_ we need this (or something like this) as the solution. Also, why you say "For more details of the scenario, see the test case added by this patch.", this isn't super helpful. Yes, the test gives an _example_, and there is an explanation similar to the above .. but I'd really like to see far more detail, e.g. a discussion of the call stack including start_remote and normal_stop, and why this is a problem. I suspect we can grep GDB for calls to normal_stop, and if we can trigger any of these from Python as a result of an event, then this is another broken case. For example, stepping into an inline frame calls normal_stop, so I suspect that using 'step' from a Python event could break -- not suggesting that more tests are needed, but maybe we should mention that there are multiple ways this can break. > > As a solution, we track whether the prompt was already blocked. If so, > we leave enabling stdin to GDB. > > With this patch, we see > > $ gdb -q -ex "source file.py" -ex "run" --args a.out > Reading symbols from /tmp/a.out... > Starting program: /tmp/a.out > loading /lib64/ld-linux-x86-64.so.2 > Python Exception : No symbol "a" in current context. > [Inferior 1 (process 3984511) exited normally] > (gdb) > > Regression-tested on X86_64 Linux using the default board file (i.e. unix). > > Co-Authored-By: Oguzhan Karakaya > Reviewed-By: Guinevere Larsen > --- > gdb/event-top.c | 3 +- > gdb/python/python.c | 29 ++++++++++ > gdb/testsuite/gdb.python/py-cmd-exception.c | 22 ++++++++ > gdb/testsuite/gdb.python/py-cmd-exception.exp | 43 +++++++++++++++ > gdb/testsuite/gdb.python/py-cmd-exception.py | 33 +++++++++++ > gdb/testsuite/gdb.python/py-cmd-prompt.c | 22 ++++++++ > gdb/testsuite/gdb.python/py-cmd-prompt.exp | 55 +++++++++++++++++++ > gdb/testsuite/gdb.python/py-cmd-prompt.py | 36 ++++++++++++ > gdb/ui.h | 5 ++ > 9 files changed, 247 insertions(+), 1 deletion(-) > create mode 100644 gdb/testsuite/gdb.python/py-cmd-exception.c > create mode 100644 gdb/testsuite/gdb.python/py-cmd-exception.exp > create mode 100644 gdb/testsuite/gdb.python/py-cmd-exception.py > create mode 100644 gdb/testsuite/gdb.python/py-cmd-prompt.c > create mode 100644 gdb/testsuite/gdb.python/py-cmd-prompt.exp > create mode 100644 gdb/testsuite/gdb.python/py-cmd-prompt.py > > diff --git a/gdb/event-top.c b/gdb/event-top.c > index 9886ca46e7b..c24717eb2f0 100644 > --- a/gdb/event-top.c > +++ b/gdb/event-top.c > @@ -508,7 +508,8 @@ async_enable_stdin (void) > { > struct ui *ui = current_ui; > > - if (ui->prompt_state == PROMPT_BLOCKED) > + if (ui->prompt_state == PROMPT_BLOCKED > + && !ui->keep_prompt_blocked) > { > target_terminal::ours (); > ui->register_file_handler (); > diff --git a/gdb/python/python.c b/gdb/python/python.c > index d569fb5a3e4..eef0017e407 100644 > --- a/gdb/python/python.c > +++ b/gdb/python/python.c > @@ -658,6 +658,35 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) > > scoped_restore preventer = prevent_dont_repeat (); > > + /* If the executed command raises an exception, we may have to > + enable stdin and recover the GDB prompt. > + > + Stdin should not be re-enabled if it is already blocked because, > + for example, we are running a command in the context of a > + synchronous execution command ("run", "continue", etc.). Like > + this: > + > + User runs "continue" > + --> command blocks the prompt > + --> Python API is invoked, e.g. via events > + --> gdb.execute(C) invoked inside Python > + --> command C raises an exception > + > + In this case case, GDB would go back to the top "continue" command > + and move on with its normal course of execution. That is, it > + would enable stdin in the way it normally does. > + > + Similarly, if the command we are about to execute enables the > + stdin while we are still in the context of a synchronous > + execution command, we would be displaying the prompt too early, > + before the surrounding command completes. As with the commit message, this comment seems to focus on the wrong case. We should stress the non-local case more, as that justifies _this_ solution over a solution that is handled entirely within this function. > + > + For these reasons, we keep the prompt blocked, if it already is. */ > + bool prompt_was_blocked = (current_ui->prompt_state == PROMPT_BLOCKED); > + scoped_restore save_prompt_state > + = make_scoped_restore (¤t_ui->keep_prompt_blocked, > + prompt_was_blocked); > + > try > { > gdbpy_allow_threads allow_threads; > diff --git a/gdb/testsuite/gdb.python/py-cmd-exception.c b/gdb/testsuite/gdb.python/py-cmd-exception.c > new file mode 100644 > index 00000000000..f151960ce3a > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-cmd-exception.c > @@ -0,0 +1,22 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2023 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 . */ > + > +int > +main () > +{ > + return 0; > +} > diff --git a/gdb/testsuite/gdb.python/py-cmd-exception.exp b/gdb/testsuite/gdb.python/py-cmd-exception.exp > new file mode 100644 > index 00000000000..3b81131ee08 > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-cmd-exception.exp > @@ -0,0 +1,43 @@ > +# Copyright (C) 2023 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 . > + > +# This file is part of the GDB testsuite. It tests a corner case where > +# the executed GDB command gives an exception and enabling the stdin would > +# cause the GDB prompt to be displayed prematurely. > + > +load_lib gdb-python.exp > + > +require !use_gdb_stub allow_python_tests > + > +standard_testfile > + > +if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { > + return -1 > +} > + > +set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py] > +gdb_test_no_output "source $pyfile" "source the script" > + > +gdb_start_cmd > + > +gdb_test_multiple "" "check the prompt" { > + -re "breakpoint $decimal, main .*\r\n$gdb_prompt $" { > + # The prompt is positioned correctly. > + pass $gdb_test_name > + } > + -re "No symbol \"a\" in current context.\r\n$gdb_prompt " { > + fail $gdb_test_name > + } > +} > diff --git a/gdb/testsuite/gdb.python/py-cmd-exception.py b/gdb/testsuite/gdb.python/py-cmd-exception.py > new file mode 100644 > index 00000000000..51199bd3fe3 > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-cmd-exception.py > @@ -0,0 +1,33 @@ > +# Copyright (C) 2023 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 . > + > +import gdb > + > +class MyListener: > + def __init__(self): > + gdb.events.new_objfile.connect(self.handle_new_objfile_event) > + self.processed_objfile = False > + > + def handle_new_objfile_event(self, event): > + if self.processed_objfile: > + return > + > + print('loading ' + event.new_objfile.filename) > + self.processed_objfile = True > + > + # There is no variable 'a'. The command raises an exception. > + gdb.execute('print a') > + > +the_listener = MyListener() > diff --git a/gdb/testsuite/gdb.python/py-cmd-prompt.c b/gdb/testsuite/gdb.python/py-cmd-prompt.c > new file mode 100644 > index 00000000000..6956ba4858d > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-cmd-prompt.c > @@ -0,0 +1,22 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2023 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 . */ > + > +int > +main () > +{ > + return 0; /* break-here */ > +} > diff --git a/gdb/testsuite/gdb.python/py-cmd-prompt.exp b/gdb/testsuite/gdb.python/py-cmd-prompt.exp > new file mode 100644 > index 00000000000..968f5603fc1 > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-cmd-prompt.exp > @@ -0,0 +1,55 @@ > +# Copyright (C) 2023 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 . > + > +# This file is part of the GDB testsuite. It tests a corner case > +# where the executed GDB command enables the stdin while running > +# inside a synchronous command, causing the GDB prompt to be displayed > +# prematurely. > + > +load_lib gdb-python.exp > +load_lib gdbserver-support.exp > + > +# We use the start command. > +require !use_gdb_stub > +require allow_python_tests allow_gdbserver_tests > + > +standard_testfile > + > +if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { > + return -1 > +} > + > +set bp_line [gdb_get_line_number "break-here"] > +gdb_breakpoint $bp_line > + > +set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py] > +gdb_test_no_output "source $pyfile" "source the script" > + > +set gdbserver [gdbserver_start "" [standard_output_file $binfile]] > +set gdbserver_gdbport [lindex $gdbserver 1] > +gdb_test_no_output "python the_listener.port = '${gdbserver_gdbport}'" > + > +gdb_run_cmd > + > +gdb_test_multiple "" "prompt is positioned correctly" { > + -re -wrap "break-here \[^\r\n\]+" { > + pass $gdb_test_name > + } > +} > + > +# Clean up the gdbserver. > +gdb_test "inferior 2" "Switching to inferior 2.*" \ > + "switch to gdbserver for clean up" > +gdbserver_exit 0 > diff --git a/gdb/testsuite/gdb.python/py-cmd-prompt.py b/gdb/testsuite/gdb.python/py-cmd-prompt.py > new file mode 100644 > index 00000000000..a920309d39e > --- /dev/null > +++ b/gdb/testsuite/gdb.python/py-cmd-prompt.py > @@ -0,0 +1,36 @@ > +# Copyright (C) 2023 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 . > + > +import gdb > + > +class MyListener: > + def __init__(self): > + gdb.events.new_objfile.connect(self.handle_new_objfile_event) > + self.processed_objfile = False > + self.port = "uninitialized" > + > + def handle_new_objfile_event(self, event): > + if self.processed_objfile: > + return > + > + print('loading ' + event.new_objfile.filename) > + self.processed_objfile = True > + > + gdb.execute('add-inferior -no-connection') > + gdb.execute('inferior 2') > + gdb.execute('target remote ' + self.port) > + gdb.execute('inferior 1') > + > +the_listener = MyListener() > diff --git a/gdb/ui.h b/gdb/ui.h > index ed75e041e5f..4303d11c58c 100644 > --- a/gdb/ui.h > +++ b/gdb/ui.h > @@ -135,6 +135,11 @@ struct ui > /* See enum prompt_state's description. */ > enum prompt_state prompt_state = PROMPT_NEEDED; > > + /* Whether the prompt should be kept blocked. This is useful to not > + recover the prompt too early in the context of nested command > + execution. */ > + bool keep_prompt_blocked = false; In the comment: s/recover/unblock/ makes more sense I think. Thanks, Andrew > + > /* The fields below that start with "m_" are "private". They're > meant to be accessed through wrapper macros that make them look > like globals. */ > -- > 2.34.1 > > Intel Deutschland GmbH > Registered Address: Am Campeon 10, 85579 Neubiberg, Germany > Tel: +49 89 99 8853-0, www.intel.de > Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva > Chairperson of the Supervisory Board: Nicole Lau > Registered Office: Munich > Commercial Register: Amtsgericht Muenchen HRB 186928