#define PRIMITIVE_CAT(x, y) x ## y
#define CAT(x, y) PRIMITIVE_CAT (x, y)
-static double __attribute__ ((noinline, noclone))
+static double __attribute_optimization_barrier__
CAT (do_one_test_kernel, POSTFIX) (const char *s, size_t len)
{
return (double) cur / (double) NFIXED_ITERS;
}
-static double __attribute__ ((noinline, noclone))
+static double __attribute_optimization_barrier__
CAT (do_rand_test_kernel, POSTFIX) (char const *bufs,
unsigned int const *sizes)
{
json_element_object_end (json_ctx);
}
-static void __attribute__ ((noinline, noclone))
+static void __attribute_optimization_barrier__
do_rand_test (json_ctx_t *json_ctx)
{
size_t i, sz, offset;
branch coming we want to test the case where a potential branch in
strchr can be used to skip a later mispredict because of the
relationship between the two branches. */
-static void __attribute__ ((noinline, noclone))
+static void __attribute_optimization_barrier__
do_one_rand_plus_branch_test (json_ctx_t *json_ctx, impl_t *impl,
const CHAR *s, const CHAR *c)
{
json_element_double (json_ctx, (double)cur / (double)iters);
}
-static void __attribute__ ((noinline, noclone))
+static void __attribute_optimization_barrier__
do_one_rand_test (json_ctx_t *json_ctx, impl_t *impl, const CHAR *s,
const CHAR *c)
{
/* Use this attribute to prevent inlining, so that all expected frames
are present. */
-#define NO_INLINE __attribute__ ((noinline, noclone, weak))
+#define NO_INLINE __attribute__ ((weak)) __attribute_optimization_barrier__
/* Look for a match in SYM from backtrace_symbols to NAME, a fragment
of a function name. Ignore the filename before '(', but presume
#include <signal.h>
static void
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
test (char *foo)
{
int i;
int foo __attribute__ ((aligned (ALIGN))) = 1;
bool
-__attribute__ ((weak, noclone, noinline))
+__attribute__ ((weak)) __attribute_optimization_barrier__
is_aligned_p (void *p, int align)
{
return (((uintptr_t) p) & (align - 1)) == 0;
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
+#include <sys/cdefs.h>
+
/* This program does not use the test harness because we want tight
control over the call graph. */
-__attribute__ ((noinline, noclone, weak)) void
+__attribute__ ((weak)) __attribute_optimization_barrier__ void
f1 (void)
{
}
-__attribute__ ((noinline, noclone, weak)) void
+__attribute__ ((weak)) __attribute_optimization_barrier__ void
f2 (void)
{
f1 ();
asm volatile ("");
}
-__attribute__ ((noinline, noclone, weak)) void
+__attribute__ ((weak)) __attribute_optimization_barrier__ void
f3 (int count)
{
for (int i = 0; i < count; ++i)
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
+#include <sys/cdefs.h>
+
/* Program with sufficiently complex, yet pointless, call graph
that it will trigger an mcount overflow, when you set the
minarcs/maxarcs tunables to very low values. */
/* Defines 16 leaf functions named f1_0 to f1_15 */
#define REP(n) \
- __attribute__ ((noinline, noclone, weak)) void f1_##n (void) {};
+ __attribute__ ((weak)) __attribute_optimization_barrier__ void f1_##n (void) {};
REPS
#undef REP
/* Calls all 16 leaf functions f1_* in succession */
-__attribute__ ((noinline, noclone, weak)) void
+__attribute__ ((weak)) __attribute_optimization_barrier__ void
f2 (void)
{
# define REP(n) f1_##n();
/* Defines 16 functions named f2_0 to f2_15, which all just call f2 */
#define REP(n) \
- __attribute__ ((noinline, noclone, weak)) void \
+ __attribute__ ((weak)) __attribute_optimization_barrier__ void \
f2_##n (void) { f2(); PREVENT_TAIL_CALL; };
REPS
#undef REP
-__attribute__ ((noinline, noclone, weak)) void
+__attribute__ ((weak)) __attribute_optimization_barrier__ void
f3 (int count)
{
for (int i = 0; i < count; ++i)
#endif /* !defined _ISOMAC */
+/* Prevents a function from being considered for inlining and cloning. */
+#ifdef __clang__
+# define __attribute_optimization_barrier__ __attribute__ ((optnone))
+#else
+# define __attribute_optimization_barrier__ __attribute__ ((noinline, noclone))
+#endif
+
#endif
static size_t malloc_size = 32;
static void
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
unoptimized_free (void *ptr)
{
free (ptr);
/* Wrapper for calloc with an optimization barrier. */
static void *
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
allocate_zeroed (size_t a, size_t b)
{
return calloc (a, b);
}
/* Used as an optimization barrier to force a heap allocation. */
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static void
my_free (void *ptr)
{
static int error_count;
-__attribute__ ((noclone, noinline))
+__attribute_optimization_barrier__
struct Array
allocate (size_t bytes)
{
return __extension__ (struct Array) {bytes, p};
}
-__attribute__ ((noclone, noinline))
+__attribute_optimization_barrier__
void
deallocate (struct Array b)
{
}
}
-__attribute__ ((noclone, noinline))
+__attribute_optimization_barrier__
void *
do_mmap (void *addr, size_t length)
{
MAP_PRIVATE | MAP_ANON, -1, 0);
}
-__attribute__ ((noclone, noinline))
+__attribute_optimization_barrier__
void *
reallocate (struct Array b)
{
return NULL;
}
-__attribute__ ((noclone, noinline))
+__attribute_optimization_barrier__
void
protect (struct Array b)
{
}
}
-__attribute__ ((noclone, noinline))
+__attribute_optimization_barrier__
ssize_t
do_read (int fd, void *ptr, struct Array b)
{
return 0;
}
-__attribute__ ((noclone, noinline))
+__attribute_optimization_barrier__
ssize_t
do_write (int fd, void *ptr, struct Array b)
{
#include <support/xthread.h>
/* Throw a std::runtime_exception. */
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
do_throw_exception ()
{
~class_with_destructor ();
};
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
class_with_destructor::class_with_destructor ()
{
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
class_with_destructor::~class_with_destructor ()
{
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
function_with_destructed_object ()
{
/* Check that VALUE is the magic value for INDEX, behind a compiler
barrier. */
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_magic (int index, unsigned int value)
{
/* Check that VALUE is the magic value for INDEX, behind a compiler
barrier. Double variant. */
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_magic (int index, double value)
{
call_pthread_exit are used to call pthread_exit indirectly, with
the intent of clobbering the register values. */
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
call_pthread_exit_0 (const values<unsigned int> *pvalues)
{
pthread_exit (NULL);
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
call_pthread_exit_1 (const values<double> *pvalues)
{
call_pthread_exit_0 (&other_values);
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
call_pthread_exit ()
{
pthread_exit. If Nested is true, call pthread_exit indirectly via
call_pthread_exit. */
template <class T, bool Nested>
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void *
threadfunc (void *closure)
{
template <counter *Counter>
struct counting
{
- counting () __attribute__ ((noinline, noclone));
- ~counting () __attribute__ ((noinline, noclone));
- void operation () __attribute__ ((noinline, noclone));
+ counting () __attribute_optimization_barrier__;
+ ~counting () __attribute_optimization_barrier__;
+ void operation () __attribute_optimization_barrier__;
};
template<counter *Counter>
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
counting<Counter>::counting ()
{
++Counter->constructed;
}
template<counter *Counter>
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
counting<Counter>::~counting ()
{
++Counter->destructed;
}
template<counter *Counter>
-void __attribute__ ((noinline, noclone))
+void __attribute_optimization_barrier__
counting<Counter>::operation ()
{
// Optimization barrier.
/* Check that ADDRESS is aligned to ALIGNMENT bytes, behind a compiler
barrier. */
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_align (void *address, size_t alignment)
{
/* Various alignment checking functions. */
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_align_int (void)
{
check_align (&a, __alignof__ (a));
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_align_long (void)
{
check_align (&a, __alignof__ (a));
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_align_long_long (void)
{
check_align (&a, __alignof__ (a));
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_align_double (void)
{
check_align (&a, __alignof__ (a));
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_align_4 (void)
{
check_align (&a, 4);
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_align_8 (void)
{
check_align (&a, 8);
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_align_16 (void)
{
check_align (&a, 16);
}
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_align_32 (void)
{
}
/* Call all the alignment checking functions. */
-__attribute__ ((noinline, noclone, weak))
+__attribute__ ((weak)) __attribute_optimization_barrier__
void
check_alignments (void)
{
thread_local A a;
void
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
optimization_barrier (A &)
{
}
static void f2 (void);
static void
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
f1 (void)
{
printf ("start f1\n");
}
static void
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
f2 (void)
{
printf ("start f2\n");
}
static int
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
do_test_1 (void)
{
char st1[32768];
}
static void
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
call_longjmp (void)
{
longjmp_called = 1;
static void f2 (void);
static void
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
f1 (void)
{
printf ("start f1\n");
}
static void
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
f2 (void)
{
printf ("start f2\n");
static atomic_int done;
static void
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
f2 (void)
{
printf ("start f2\n");
static atomic_int done;
static void
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
f2 (void)
{
done++;
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
static void
func4(ucontext_t *uocp, ucontext_t *ucp, const char *str, const char *fmt)
{
printf(" %sfunc4: returning\e[0m\n", fmt);
}
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
static void
func3(ucontext_t *uocp, ucontext_t *ucp, const char *str, const char *fmt)
{
printf(" %sfunc3: returning\e[0m\n", fmt);
}
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
static void
func1(void)
{
}
}
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
static void
func2(void)
{
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
static void
func4(ucontext_t *uocp, ucontext_t *ucp, const char *str, const char *fmt)
{
printf(" %sfunc4: returning\e[0m\n", fmt);
}
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
static void
func3(ucontext_t *uocp, ucontext_t *ucp, const char *str, const char *fmt)
{
printf(" %sfunc3: returning\e[0m\n", fmt);
}
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
static void
func1(void)
{
}
}
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
static void
func2(void)
{
thread_local A a2;
void
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
optimization_barrier (A &)
{
}
static ucontext_t uc_main, uc_co;
-static __attribute__ ((noinline, noclone)) int
+static __attribute_optimization_barrier__ int
use_test_buffer (unsigned char *buf)
{
unsigned int sum = 0;
#include <stdint.h>
int
-__attribute__ ((weak, noclone, noinline))
+__attribute__ ((weak)) __attribute_optimization_barrier__
is_aligned (void *p, int align)
{
return (((uintptr_t) p) & (align - 1)) != 0;
extern void bar (void);
void
-__attribute__ ((noclone, noinline))
+__attribute_optimization_barrier__
test (void (*func_p) (void))
{
func_p ();
static atomic_int done;
static void
-__attribute__((noinline, noclone))
+__attribute_optimization_barrier__
f2 (void)
{
printf ("start f2\n");
#include <x86intrin.h>
#include <support/test-driver.h>
-__attribute__ ((noclone, noinline))
+__attribute_optimization_barrier__
static void
do_test_1 (void)
{
#define X86_XSTATE_TILEDATA_ID 18
/* Initialize tile config. */
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static void
init_tile_config (__tilecfg *tileinfo)
{
/* Fill the stack with non-zero values. This makes a crash in
snprintf more likely. */
-static void __attribute__ ((noinline, noclone))
+static void __attribute_optimization_barrier__
fill_stack (void)
{
char buffer[65536];
#define STRING_SIZE 1024
char string1[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
char string1[STRING_SIZE];
char string2[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
char string1[STRING_SIZE];
char string2[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
#define STRING_SIZE 1024
char string1[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
#define STRING_SIZE 1024
char string1[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_SUCCESS;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
#define STRING_SIZE 1024
char string1[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
CHAR string1[STRING_SIZE];
CHAR string2[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
char string1[STRING_SIZE];
char string2[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
#define STRING_SIZE 1024
char string1[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
CHAR string1[STRING_SIZE];
CHAR string2[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
return 1;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function_overflow (void)
{
return 1;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function_overflow2 (void)
{
#define STRING_SIZE 1024
char string1[STRING_SIZE];
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
prepare (void)
{
return EXIT_FAILURE;
}
-__attribute__ ((noinline, noclone))
+__attribute_optimization_barrier__
static int
function (void)
{
} parameter_t;
size_t
-__attribute__ ((weak, noinline, noclone))
+__attribute__ ((weak)) __attribute_optimization_barrier__
do_strlen (parameter_t *a, int zero, const CHAR *str)
{
return CALL (a, str);