forked from Imagelibrary/binutils-gdb
A test recently added to gdb.opt/inline-cmds.exp fails for
arm-none-eabi targets because -O2 leads to instructions to be
reordered widely.
I guess it might have made sense years ago to enable optimization in
these tests, but I fail to see the need for that nowadays.
Using -O0 while relying on __attribute__((always_inline)), which is
already used in the tests [1] [2], avoids this sort of trouble, while
still exercising the inlining-related use cases that are the focus of
these tests.
I think that nowadays we can safely assume that all compilers we care
about support __attribute__((always_inline)) or similar.
[1] - Except one spot that missed it.
[2] - Note that the .exp files make sure the frames that should have
been inlined are indeed inlined, with "info frame".
gdb/testsuite/ChangeLog:
2016-07-19 Pedro Alves <palves@redhat.com>
* gdb.opt/inline-break.exp: Remove optimize=-O2.
* gdb.opt/inline-bt.exp: Likewise.
* gdb.opt/inline-cmds.exp: Remove optimize=-O2 and add
additional_flags=-Winline.
* gdb.opt/inline-locals.exp: Likewise.
* gdb.opt/inline-markers.c (ATTR): Define.
(inlined_fn): Use it.
44 lines
1.0 KiB
C
44 lines
1.0 KiB
C
/* Copyright (C) 2008-2016 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 <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifdef __GNUC__
|
|
# define ATTR __attribute__((always_inline))
|
|
#else
|
|
# define ATTR
|
|
#endif
|
|
|
|
extern int x, y;
|
|
extern volatile int z;
|
|
|
|
void bar(void)
|
|
{
|
|
x += y; /* set breakpoint 1 here */
|
|
}
|
|
|
|
void marker(void)
|
|
{
|
|
x += y - z; /* set breakpoint 2 here */
|
|
}
|
|
|
|
inline ATTR void inlined_fn(void)
|
|
{
|
|
x += y + z;
|
|
}
|
|
|
|
void noinline(void)
|
|
{
|
|
inlined_fn (); /* inlined */
|
|
}
|