Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 Jun 2017 17:44:31 -0500
From:      Eric van Gyzen <vangyzen@FreeBSD.org>
To:        FreeBSD Hackers <freebsd-hackers@freebsd.org>
Subject:   Function attribute for optimization level
Message-ID:  <85c47390-dd27-aa74-24fe-25a9a5352527@FreeBSD.org>

next in thread | raw e-mail | index | archive | help
_thr_rtld_init() calls memcpy() for the sole purpose of resolving its PLT entry.
 With clang 4.0 and the current code, compiler optimization defeats this attempt
by completely eliding the call.  Other compilers or code might emit inline
instructions instead of the library call, also defeating the purpose.

I propose adding "__no_optimization" to sys/cdefs.h.  The patch is below.
Empirical testing shows that clang 3.7 and later support "optnone", and gcc 4.6
and later support "optimize()".  Clang 3.4 does not support either, so it takes
the define-to-empty case.  I did not test clang 3.5 or 3.6.

Side note:  GCC 4.6 with optimize(0) on amd64 emits two movq instructions for
memset(x,0,16), but GCC 5 emits a call to memset().

I have done no research to see if other popular codebases have such a
definition.  If you know of one, please tell me; I would gladly adopt an already
common name for this proposal, for the sake of portability.

Thanks in advance for your feedback.

Eric


diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h
index 9cdc03c861cb..e370f6d6459e 100644
--- a/sys/sys/cdefs.h
+++ b/sys/sys/cdefs.h
@@ -396,6 +396,14 @@
 #define        __unreachable() ((void)0)
 #endif

+#if __has_attribute(optnone)
+#define        __no_optimization       __attribute__((optnone))
+#elif __has_attribute(optimize)
+#define        __no_optimization       __attribute__((optimize(0)))
+#else
+#define        __no_optimization
+#endif
+
 /* XXX: should use `#if __STDC_VERSION__ < 199901'. */
 #if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER)
 #define        __func__        NULL



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?85c47390-dd27-aa74-24fe-25a9a5352527>