mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-11-25 16:47:38 +01:00
Define and use `NOINLINE'
This commit is contained in:
parent
397f32a378
commit
e3e49dc28a
5 changed files with 23 additions and 19 deletions
|
@ -33,6 +33,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
# define ALIGNED(x) __attribute__((aligned(x)))
|
# define ALIGNED(x) __attribute__((aligned(x)))
|
||||||
# define UNUSED __attribute__((unused))
|
# define UNUSED __attribute__((unused))
|
||||||
|
# define NOINLINE __attribute__((noinline))
|
||||||
# define NORETURN __attribute__((noreturn))
|
# define NORETURN __attribute__((noreturn))
|
||||||
# define ALIAS(name) __attribute__((alias (#name)))
|
# define ALIAS(name) __attribute__((alias (#name)))
|
||||||
# if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
|
# if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
|
||||||
|
@ -55,6 +56,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
# define ALIGNED(x)
|
# define ALIGNED(x)
|
||||||
# define ALWAYS_INLINE
|
# define ALWAYS_INLINE
|
||||||
# define UNUSED
|
# define UNUSED
|
||||||
|
# define NOINLINE
|
||||||
# define NORETURN
|
# define NORETURN
|
||||||
# define ALIAS(name)
|
# define ALIAS(name)
|
||||||
# define HIDDEN
|
# define HIDDEN
|
||||||
|
|
|
@ -27,6 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <libunwind.h>
|
#include <libunwind.h>
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
@ -53,7 +54,7 @@ gettime (void)
|
||||||
return tv.tv_sec + 1e-6*tv.tv_usec;
|
return tv.tv_sec + 1e-6*tv.tv_usec;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __attribute__((noinline))
|
static int NOINLINE
|
||||||
measure_unwind (int maxlevel, double *step)
|
measure_unwind (int maxlevel, double *step)
|
||||||
{
|
{
|
||||||
double stop, start;
|
double stop, start;
|
||||||
|
@ -88,7 +89,7 @@ measure_unwind (int maxlevel, double *step)
|
||||||
|
|
||||||
static int f1 (int, int, double *);
|
static int f1 (int, int, double *);
|
||||||
|
|
||||||
static int __attribute__((noinline))
|
static int NOINLINE
|
||||||
g1 (int level, int maxlevel, double *step)
|
g1 (int level, int maxlevel, double *step)
|
||||||
{
|
{
|
||||||
if (level == maxlevel)
|
if (level == maxlevel)
|
||||||
|
@ -98,7 +99,7 @@ g1 (int level, int maxlevel, double *step)
|
||||||
return f1 (level + 1, maxlevel, step) + level;
|
return f1 (level + 1, maxlevel, step) + level;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __attribute__((noinline))
|
static int NOINLINE
|
||||||
f1 (int level, int maxlevel, double *step)
|
f1 (int level, int maxlevel, double *step)
|
||||||
{
|
{
|
||||||
if (level == maxlevel)
|
if (level == maxlevel)
|
||||||
|
|
|
@ -27,6 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <libunwind.h>
|
#include <libunwind.h>
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
@ -53,7 +54,7 @@ gettime (void)
|
||||||
return tv.tv_sec + 1e-6*tv.tv_usec;
|
return tv.tv_sec + 1e-6*tv.tv_usec;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __attribute__((noinline))
|
static int NOINLINE
|
||||||
measure_unwind (int maxlevel, double *step)
|
measure_unwind (int maxlevel, double *step)
|
||||||
{
|
{
|
||||||
double stop, start;
|
double stop, start;
|
||||||
|
@ -74,7 +75,7 @@ measure_unwind (int maxlevel, double *step)
|
||||||
|
|
||||||
static int f1 (int, int, double *);
|
static int f1 (int, int, double *);
|
||||||
|
|
||||||
static int __attribute__((noinline))
|
static int NOINLINE
|
||||||
g1 (int level, int maxlevel, double *step)
|
g1 (int level, int maxlevel, double *step)
|
||||||
{
|
{
|
||||||
if (level == maxlevel)
|
if (level == maxlevel)
|
||||||
|
@ -84,7 +85,7 @@ g1 (int level, int maxlevel, double *step)
|
||||||
return f1 (level + 1, maxlevel, step) + level;
|
return f1 (level + 1, maxlevel, step) + level;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __attribute__((noinline))
|
static int NOINLINE
|
||||||
f1 (int level, int maxlevel, double *step)
|
f1 (int level, int maxlevel, double *step)
|
||||||
{
|
{
|
||||||
if (level == maxlevel)
|
if (level == maxlevel)
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#define UNW_LOCAL_ONLY
|
#define UNW_LOCAL_ONLY
|
||||||
#include <libunwind.h>
|
#include <libunwind.h>
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -9,12 +11,12 @@ int ok;
|
||||||
int verbose;
|
int verbose;
|
||||||
|
|
||||||
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 3)
|
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 3)
|
||||||
void a (int, ...) __attribute__((noinline, optimize(0)));
|
void a (int, ...) __attribute__((optimize(0)));
|
||||||
void b (void) __attribute__((noinline, optimize(0)));
|
void b (void) __attribute__((optimize(0)));
|
||||||
void c (void) __attribute__((noinline, optimize(0)));
|
void c (void) __attribute__((optimize(0)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void NOINLINE
|
||||||
b (void)
|
b (void)
|
||||||
{
|
{
|
||||||
void *v[20];
|
void *v[20];
|
||||||
|
@ -33,13 +35,13 @@ b (void)
|
||||||
printf ("[%d] %p\n", i, v[i]);
|
printf ("[%d] %p\n", i, v[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void NOINLINE
|
||||||
c (void)
|
c (void)
|
||||||
{
|
{
|
||||||
b ();
|
b ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void NOINLINE
|
||||||
a (int d, ...)
|
a (int d, ...)
|
||||||
{
|
{
|
||||||
switch (d)
|
switch (d)
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
/* This program should crash and produce coredump */
|
/* This program should crash and produce coredump */
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -85,24 +87,20 @@ write_maps(char *fname)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
int a(void) __attribute__((noinline));
|
int c(int x) NOINLINE __attribute__((alias("b")));
|
||||||
int b(int x) __attribute__((noinline));
|
|
||||||
int c(int x) __attribute__((noinline, alias("b")));
|
|
||||||
#define compiler_barrier() asm volatile("");
|
#define compiler_barrier() asm volatile("");
|
||||||
#else
|
#else
|
||||||
int a(void);
|
|
||||||
int b(int x);
|
|
||||||
int c(int x);
|
int c(int x);
|
||||||
#define compiler_barrier()
|
#define compiler_barrier()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int a(void)
|
int NOINLINE a(void)
|
||||||
{
|
{
|
||||||
*(volatile int *)32 = 1;
|
*(volatile int *)32 = 1;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int b(int x)
|
int NOINLINE b(int x)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue