aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorAlexandre Oliva <oliva@adacore.com>2023-12-19 21:06:22 -0300
committerAlexandre Oliva <oliva@gnu.org>2023-12-19 21:06:22 -0300
commit1b83fce7df32c72bf8e0c766e5ccb285801bce15 (patch)
treebb82744d19fd0093d834a9fa27257205d5304350 /libgcc
parent66c8b0f695ffaf1b727dc024618b80256317ae33 (diff)
downloadgcc-1b83fce7df32c72bf8e0c766e5ccb285801bce15.zip
gcc-1b83fce7df32c72bf8e0c766e5ccb285801bce15.tar.gz
gcc-1b83fce7df32c72bf8e0c766e5ccb285801bce15.tar.bz2
strub: avoid lto inlining
The strub builtins are not suited for cross-unit inlining, they should only be inlined by the builtin expanders, if at all. While testing on sparc64, it occurred to me that, if libgcc was built with LTO enabled, lto1 might inline them, and that would likely break things. So, make sure they're clearly marked as not inlinable. for libgcc/ChangeLog * strub.c (ATTRIBUTE_NOINLINE): New. (ATTRIBUTE_STRUB_CALLABLE): Add it. (__strub_dummy_force_no_leaf): Drop it.
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/strub.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/libgcc/strub.c b/libgcc/strub.c
index b0f990d..3b7cc26 100644
--- a/libgcc/strub.c
+++ b/libgcc/strub.c
@@ -36,7 +36,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
# define TOPS <
#endif
-#define ATTRIBUTE_STRUB_CALLABLE __attribute__ ((__strub__ ("callable")))
+/* Make sure these builtins won't be inlined, even with LTO. */
+#define ATTRIBUTE_NOINLINE \
+ __attribute__ ((__noinline__, __noclone__, __noipa__))
+
+#define ATTRIBUTE_STRUB_CALLABLE \
+ __attribute__ ((__strub__ ("callable"))) ATTRIBUTE_NOINLINE
/* Enter a stack scrubbing context, initializing the watermark to the caller's
stack address. */
@@ -72,7 +77,6 @@ __strub_update (void **watermark)
/* Dummy function, called to force the caller to not be a leaf function, so
that it can't use the red zone. */
static void ATTRIBUTE_STRUB_CALLABLE
-__attribute__ ((__noinline__, __noipa__))
__strub_dummy_force_no_leaf (void)
{
}