Commit 0c8967c9 authored by Ingo Molnar's avatar Ingo Molnar

Merge tag 'perf-core-for-mingo-4.11-20170215' of...

Merge tag 'perf-core-for-mingo-4.11-20170215' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core

Pull perf/core clang fixes from Arnaldo Carvalho de Melo:

Changes to make tools/{perf,lib/{bpf,traceevent,api}} build with
CC=clang, to, for instance, take advantage of warnings (Arnaldo Carvalho de Melo):

- Conditionally request some warning options not available on clang

- Set the maximum optimization level to -O3 when using CC=clang, leave
  the previous setting of -O6 otherwise.

- Make it an error to pass a signed value to OPTION_UINTEGER, so that
  we can remove abs(unsigned int) calls in 'perf bench futex'.

- Make sure dprintf() is not defined before using that name in 'perf bench numa'

- Avoid using field after variable sized type, its a GNU extension, use
  equivalent code.

- Fix some bugs where some variables could be used unitialized,
  something not caught by gcc.

- Fix some spots where we were testing struct->array[] members against
  NULL, it will always evaluate to 'true'.

- Add missing parse_events_error() prototype in the bison file.

There are still one problem when trying to build the python support, but
this are the 'size' outputs for 'make -C tools/perf NO_LIBPYTHON' for
gcc and clang builds:

  DW_AT_producer: clang version 4.0.0 (http://llvm.org/git/clang.git f5be8ba13adc4ba1011a7ccd60c844bd60427c1c) (ht

  $ size ~/bin/perf
     text    data     bss     dec     hex     filename
  3447514  831320 23901696  28180530  1ae0032 /home/acme/bin/perf

  DW_AT_producer: GNU C99 6.3.1 20161221 (Red Hat 6.3.1-1) -mtune=generic -march=x86-64 -ggdb3 -O6 -std=gnu99
+-fno-omit-frame-pointer -funwind-tables -fstack-protector-all

  $ size ~/bin/perf
     text    data     bss     dec     hex     filename
  3671662  836480 23902752  28410894  1b1840e /home/acme/bin/perf
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents 277d6f1d 34a0548f
...@@ -17,7 +17,13 @@ MAKEFLAGS += --no-print-directory ...@@ -17,7 +17,13 @@ MAKEFLAGS += --no-print-directory
LIBFILE = $(OUTPUT)libapi.a LIBFILE = $(OUTPUT)libapi.a
CFLAGS := $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) CFLAGS := $(EXTRA_WARNINGS) $(EXTRA_CFLAGS)
CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -O6 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC
ifeq ($(CC), clang)
CFLAGS += -O3
else
CFLAGS += -O6
endif
# Treat warnings as errors unless directed not to # Treat warnings as errors unless directed not to
ifneq ($(WERROR),0) ifneq ($(WERROR),0)
......
...@@ -19,7 +19,13 @@ MAKEFLAGS += --no-print-directory ...@@ -19,7 +19,13 @@ MAKEFLAGS += --no-print-directory
LIBFILE = $(OUTPUT)libsubcmd.a LIBFILE = $(OUTPUT)libsubcmd.a
CFLAGS := $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) CFLAGS := $(EXTRA_WARNINGS) $(EXTRA_CFLAGS)
CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -O6 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC
ifeq ($(CC), clang)
CFLAGS += -O3
else
CFLAGS += -O6
endif
# Treat warnings as errors unless directed not to # Treat warnings as errors unless directed not to
ifneq ($(WERROR),0) ifneq ($(WERROR),0)
......
...@@ -270,6 +270,8 @@ static int get_value(struct parse_opt_ctx_t *p, ...@@ -270,6 +270,8 @@ static int get_value(struct parse_opt_ctx_t *p,
} }
if (get_arg(p, opt, flags, &arg)) if (get_arg(p, opt, flags, &arg))
return -1; return -1;
if (arg[0] == '-')
return opterror(opt, "expects an unsigned numerical value", flags);
*(unsigned int *)opt->value = strtol(arg, (char **)&s, 10); *(unsigned int *)opt->value = strtol(arg, (char **)&s, 10);
if (*s) if (*s)
return opterror(opt, "expects a numerical value", flags); return opterror(opt, "expects a numerical value", flags);
...@@ -302,6 +304,8 @@ static int get_value(struct parse_opt_ctx_t *p, ...@@ -302,6 +304,8 @@ static int get_value(struct parse_opt_ctx_t *p,
} }
if (get_arg(p, opt, flags, &arg)) if (get_arg(p, opt, flags, &arg))
return -1; return -1;
if (arg[0] == '-')
return opterror(opt, "expects an unsigned numerical value", flags);
*(u64 *)opt->value = strtoull(arg, (char **)&s, 10); *(u64 *)opt->value = strtoull(arg, (char **)&s, 10);
if (*s) if (*s)
return opterror(opt, "expects a numerical value", flags); return opterror(opt, "expects a numerical value", flags);
......
...@@ -144,8 +144,12 @@ ifndef DEBUG ...@@ -144,8 +144,12 @@ ifndef DEBUG
endif endif
ifeq ($(DEBUG),0) ifeq ($(DEBUG),0)
ifeq ($(CC), clang)
CFLAGS += -O3
else
CFLAGS += -O6 CFLAGS += -O6
endif endif
endif
ifdef PARSER_DEBUG ifdef PARSER_DEBUG
PARSER_DEBUG_BISON := -t PARSER_DEBUG_BISON := -t
......
...@@ -130,8 +130,6 @@ int bench_futex_hash(int argc, const char **argv, ...@@ -130,8 +130,6 @@ int bench_futex_hash(int argc, const char **argv,
} }
ncpus = sysconf(_SC_NPROCESSORS_ONLN); ncpus = sysconf(_SC_NPROCESSORS_ONLN);
nsecs = futexbench_sanitize_numeric(nsecs);
nfutexes = futexbench_sanitize_numeric(nfutexes);
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
...@@ -139,8 +137,6 @@ int bench_futex_hash(int argc, const char **argv, ...@@ -139,8 +137,6 @@ int bench_futex_hash(int argc, const char **argv,
if (!nthreads) /* default to the number of CPUs */ if (!nthreads) /* default to the number of CPUs */
nthreads = ncpus; nthreads = ncpus;
else
nthreads = futexbench_sanitize_numeric(nthreads);
worker = calloc(nthreads, sizeof(*worker)); worker = calloc(nthreads, sizeof(*worker));
if (!worker) if (!worker)
......
...@@ -152,7 +152,6 @@ int bench_futex_lock_pi(int argc, const char **argv, ...@@ -152,7 +152,6 @@ int bench_futex_lock_pi(int argc, const char **argv,
goto err; goto err;
ncpus = sysconf(_SC_NPROCESSORS_ONLN); ncpus = sysconf(_SC_NPROCESSORS_ONLN);
nsecs = futexbench_sanitize_numeric(nsecs);
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
...@@ -160,8 +159,6 @@ int bench_futex_lock_pi(int argc, const char **argv, ...@@ -160,8 +159,6 @@ int bench_futex_lock_pi(int argc, const char **argv,
if (!nthreads) if (!nthreads)
nthreads = ncpus; nthreads = ncpus;
else
nthreads = futexbench_sanitize_numeric(nthreads);
worker = calloc(nthreads, sizeof(*worker)); worker = calloc(nthreads, sizeof(*worker));
if (!worker) if (!worker)
......
...@@ -128,8 +128,6 @@ int bench_futex_requeue(int argc, const char **argv, ...@@ -128,8 +128,6 @@ int bench_futex_requeue(int argc, const char **argv,
if (!nthreads) if (!nthreads)
nthreads = ncpus; nthreads = ncpus;
else
nthreads = futexbench_sanitize_numeric(nthreads);
worker = calloc(nthreads, sizeof(*worker)); worker = calloc(nthreads, sizeof(*worker));
if (!worker) if (!worker)
......
...@@ -217,12 +217,8 @@ int bench_futex_wake_parallel(int argc, const char **argv, ...@@ -217,12 +217,8 @@ int bench_futex_wake_parallel(int argc, const char **argv,
sigaction(SIGINT, &act, NULL); sigaction(SIGINT, &act, NULL);
ncpus = sysconf(_SC_NPROCESSORS_ONLN); ncpus = sysconf(_SC_NPROCESSORS_ONLN);
nwaking_threads = futexbench_sanitize_numeric(nwaking_threads);
if (!nblocked_threads) if (!nblocked_threads)
nblocked_threads = ncpus; nblocked_threads = ncpus;
else
nblocked_threads = futexbench_sanitize_numeric(nblocked_threads);
/* some sanity checks */ /* some sanity checks */
if (nwaking_threads > nblocked_threads || !nwaking_threads) if (nwaking_threads > nblocked_threads || !nwaking_threads)
......
...@@ -129,7 +129,6 @@ int bench_futex_wake(int argc, const char **argv, ...@@ -129,7 +129,6 @@ int bench_futex_wake(int argc, const char **argv,
} }
ncpus = sysconf(_SC_NPROCESSORS_ONLN); ncpus = sysconf(_SC_NPROCESSORS_ONLN);
nwakes = futexbench_sanitize_numeric(nwakes);
sigfillset(&act.sa_mask); sigfillset(&act.sa_mask);
act.sa_sigaction = toggle_done; act.sa_sigaction = toggle_done;
...@@ -137,8 +136,6 @@ int bench_futex_wake(int argc, const char **argv, ...@@ -137,8 +136,6 @@ int bench_futex_wake(int argc, const char **argv,
if (!nthreads) if (!nthreads)
nthreads = ncpus; nthreads = ncpus;
else
nthreads = futexbench_sanitize_numeric(nthreads);
worker = calloc(nthreads, sizeof(*worker)); worker = calloc(nthreads, sizeof(*worker));
if (!worker) if (!worker)
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#ifndef _FUTEX_H #ifndef _FUTEX_H
#define _FUTEX_H #define _FUTEX_H
#include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <sys/syscall.h> #include <sys/syscall.h>
#include <sys/types.h> #include <sys/types.h>
...@@ -100,7 +99,4 @@ static inline int pthread_attr_setaffinity_np(pthread_attr_t *attr, ...@@ -100,7 +99,4 @@ static inline int pthread_attr_setaffinity_np(pthread_attr_t *attr,
} }
#endif #endif
/* User input sanitation */
#define futexbench_sanitize_numeric(__n) abs((__n))
#endif /* _FUTEX_H */ #endif /* _FUTEX_H */
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
/* /*
* Debug printf: * Debug printf:
*/ */
#undef dprintf
#define dprintf(x...) do { if (g && g->p.show_details >= 1) printf(x); } while (0) #define dprintf(x...) do { if (g && g->p.show_details >= 1) printf(x); } while (0)
struct thread_data { struct thread_data {
......
...@@ -655,22 +655,23 @@ record__finish_output(struct record *rec) ...@@ -655,22 +655,23 @@ record__finish_output(struct record *rec)
static int record__synthesize_workload(struct record *rec, bool tail) static int record__synthesize_workload(struct record *rec, bool tail)
{ {
struct { int err;
struct thread_map map; struct thread_map *thread_map;
struct thread_map_data map_data;
} thread_map;
if (rec->opts.tail_synthesize != tail) if (rec->opts.tail_synthesize != tail)
return 0; return 0;
thread_map.map.nr = 1; thread_map = thread_map__new_by_tid(rec->evlist->workload.pid);
thread_map.map.map[0].pid = rec->evlist->workload.pid; if (thread_map == NULL)
thread_map.map.map[0].comm = NULL; return -1;
return perf_event__synthesize_thread_map(&rec->tool, &thread_map.map,
err = perf_event__synthesize_thread_map(&rec->tool, thread_map,
process_synthesized_event, process_synthesized_event,
&rec->session->machines.host, &rec->session->machines.host,
rec->opts.sample_address, rec->opts.sample_address,
rec->opts.proc_map_timeout); rec->opts.proc_map_timeout);
thread_map__put(thread_map);
return err;
} }
static int record__synthesize(struct record *rec, bool tail); static int record__synthesize(struct record *rec, bool tail);
......
...@@ -50,7 +50,8 @@ static int process_events(union perf_event **events, size_t count) ...@@ -50,7 +50,8 @@ static int process_events(union perf_event **events, size_t count)
} }
struct test_attr_event { struct test_attr_event {
struct attr_event attr; struct perf_event_header header;
struct perf_event_attr attr;
u64 id; u64 id;
}; };
...@@ -71,21 +72,17 @@ int test__parse_no_sample_id_all(int subtest __maybe_unused) ...@@ -71,21 +72,17 @@ int test__parse_no_sample_id_all(int subtest __maybe_unused)
int err; int err;
struct test_attr_event event1 = { struct test_attr_event event1 = {
.attr = {
.header = { .header = {
.type = PERF_RECORD_HEADER_ATTR, .type = PERF_RECORD_HEADER_ATTR,
.size = sizeof(struct test_attr_event), .size = sizeof(struct test_attr_event),
}, },
},
.id = 1, .id = 1,
}; };
struct test_attr_event event2 = { struct test_attr_event event2 = {
.attr = {
.header = { .header = {
.type = PERF_RECORD_HEADER_ATTR, .type = PERF_RECORD_HEADER_ATTR,
.size = sizeof(struct test_attr_event), .size = sizeof(struct test_attr_event),
}, },
},
.id = 2, .id = 2,
}; };
struct mmap_event event3 = { struct mmap_event event3 = {
......
...@@ -1448,7 +1448,7 @@ static bool ignore_missing_thread(struct perf_evsel *evsel, ...@@ -1448,7 +1448,7 @@ static bool ignore_missing_thread(struct perf_evsel *evsel,
return true; return true;
} }
static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
struct thread_map *threads) struct thread_map *threads)
{ {
int cpu, thread, nthreads; int cpu, thread, nthreads;
...@@ -1459,6 +1459,30 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, ...@@ -1459,6 +1459,30 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
if (perf_missing_features.write_backward && evsel->attr.write_backward) if (perf_missing_features.write_backward && evsel->attr.write_backward)
return -EINVAL; return -EINVAL;
if (cpus == NULL) {
static struct cpu_map *empty_cpu_map;
if (empty_cpu_map == NULL) {
empty_cpu_map = cpu_map__dummy_new();
if (empty_cpu_map == NULL)
return -ENOMEM;
}
cpus = empty_cpu_map;
}
if (threads == NULL) {
static struct thread_map *empty_thread_map;
if (empty_thread_map == NULL) {
empty_thread_map = thread_map__new_by_tid(-1);
if (empty_thread_map == NULL)
return -ENOMEM;
}
threads = empty_thread_map;
}
if (evsel->system_wide) if (evsel->system_wide)
nthreads = 1; nthreads = 1;
else else
...@@ -1655,46 +1679,16 @@ void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads) ...@@ -1655,46 +1679,16 @@ void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads)
perf_evsel__free_fd(evsel); perf_evsel__free_fd(evsel);
} }
static struct {
struct cpu_map map;
int cpus[1];
} empty_cpu_map = {
.map.nr = 1,
.cpus = { -1, },
};
static struct {
struct thread_map map;
int threads[1];
} empty_thread_map = {
.map.nr = 1,
.threads = { -1, },
};
int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
struct thread_map *threads)
{
if (cpus == NULL) {
/* Work around old compiler warnings about strict aliasing */
cpus = &empty_cpu_map.map;
}
if (threads == NULL)
threads = &empty_thread_map.map;
return __perf_evsel__open(evsel, cpus, threads);
}
int perf_evsel__open_per_cpu(struct perf_evsel *evsel, int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
struct cpu_map *cpus) struct cpu_map *cpus)
{ {
return __perf_evsel__open(evsel, cpus, &empty_thread_map.map); return perf_evsel__open(evsel, cpus, NULL);
} }
int perf_evsel__open_per_thread(struct perf_evsel *evsel, int perf_evsel__open_per_thread(struct perf_evsel *evsel,
struct thread_map *threads) struct thread_map *threads)
{ {
return __perf_evsel__open(evsel, &empty_cpu_map.map, threads); return perf_evsel__open(evsel, NULL, threads);
} }
static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel, static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
......
...@@ -23,4 +23,8 @@ $(OUTPUT)util/intel-pt-decoder/intel-pt-insn-decoder.o: util/intel-pt-decoder/in ...@@ -23,4 +23,8 @@ $(OUTPUT)util/intel-pt-decoder/intel-pt-insn-decoder.o: util/intel-pt-decoder/in
$(call rule_mkdir) $(call rule_mkdir)
$(call if_changed_dep,cc_o_c) $(call if_changed_dep,cc_o_c)
CFLAGS_intel-pt-insn-decoder.o += -I$(OUTPUT)util/intel-pt-decoder -Wno-override-init CFLAGS_intel-pt-insn-decoder.o += -I$(OUTPUT)util/intel-pt-decoder
ifneq ($(CC), clang)
CFLAGS_intel-pt-insn-decoder.o += -Wno-override-init
endif
...@@ -782,7 +782,7 @@ static u64 machine__get_running_kernel_start(struct machine *machine, ...@@ -782,7 +782,7 @@ static u64 machine__get_running_kernel_start(struct machine *machine,
int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel) int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
{ {
enum map_type type; int type;
u64 start = machine__get_running_kernel_start(machine, NULL); u64 start = machine__get_running_kernel_start(machine, NULL);
/* In case of renewal the kernel map, destroy previous one */ /* In case of renewal the kernel map, destroy previous one */
...@@ -813,7 +813,7 @@ int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel) ...@@ -813,7 +813,7 @@ int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
void machine__destroy_kernel_maps(struct machine *machine) void machine__destroy_kernel_maps(struct machine *machine)
{ {
enum map_type type; int type;
for (type = 0; type < MAP__NR_TYPES; ++type) { for (type = 0; type < MAP__NR_TYPES; ++type) {
struct kmap *kmap; struct kmap *kmap;
......
...@@ -2020,17 +2020,14 @@ static bool is_event_supported(u8 type, unsigned config) ...@@ -2020,17 +2020,14 @@ static bool is_event_supported(u8 type, unsigned config)
.config = config, .config = config,
.disabled = 1, .disabled = 1,
}; };
struct { struct thread_map *tmap = thread_map__new_by_tid(0);
struct thread_map map;
int threads[1]; if (tmap == NULL)
} tmap = { return false;
.map.nr = 1,
.threads = { 0 },
};
evsel = perf_evsel__new(&attr); evsel = perf_evsel__new(&attr);
if (evsel) { if (evsel) {
open_return = perf_evsel__open(evsel, NULL, &tmap.map); open_return = perf_evsel__open(evsel, NULL, tmap);
ret = open_return >= 0; ret = open_return >= 0;
if (open_return == -EACCES) { if (open_return == -EACCES) {
...@@ -2042,7 +2039,7 @@ static bool is_event_supported(u8 type, unsigned config) ...@@ -2042,7 +2039,7 @@ static bool is_event_supported(u8 type, unsigned config)
* *
*/ */
evsel->attr.exclude_kernel = 1; evsel->attr.exclude_kernel = 1;
ret = perf_evsel__open(evsel, NULL, &tmap.map) >= 0; ret = perf_evsel__open(evsel, NULL, tmap) >= 0;
} }
perf_evsel__delete(evsel); perf_evsel__delete(evsel);
} }
......
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
#include "parse-events.h" #include "parse-events.h"
#include "parse-events-bison.h" #include "parse-events-bison.h"
void parse_events_error(YYLTYPE *loc, void *data, void *scanner, char const *msg);
#define ABORT_ON(val) \ #define ABORT_ON(val) \
do { \ do { \
if (val) \ if (val) \
......
...@@ -945,12 +945,12 @@ static int check_info_data(struct perf_pmu_alias *alias, ...@@ -945,12 +945,12 @@ static int check_info_data(struct perf_pmu_alias *alias,
* define unit, scale and snapshot, fail * define unit, scale and snapshot, fail
* if there's more than one. * if there's more than one.
*/ */
if ((info->unit && alias->unit) || if ((info->unit && alias->unit[0]) ||
(info->scale && alias->scale) || (info->scale && alias->scale) ||
(info->snapshot && alias->snapshot)) (info->snapshot && alias->snapshot))
return -EINVAL; return -EINVAL;
if (alias->unit) if (alias->unit[0])
info->unit = alias->unit; info->unit = alias->unit;
if (alias->scale) if (alias->scale)
......
...@@ -2061,7 +2061,7 @@ static int find_perf_probe_point_from_map(struct probe_trace_point *tp, ...@@ -2061,7 +2061,7 @@ static int find_perf_probe_point_from_map(struct probe_trace_point *tp,
bool is_kprobe) bool is_kprobe)
{ {
struct symbol *sym = NULL; struct symbol *sym = NULL;
struct map *map; struct map *map = NULL;
u64 addr = tp->address; u64 addr = tp->address;
int ret = -ENOENT; int ret = -ENOENT;
......
...@@ -1901,7 +1901,7 @@ int maps__set_kallsyms_ref_reloc_sym(struct map **maps, ...@@ -1901,7 +1901,7 @@ int maps__set_kallsyms_ref_reloc_sym(struct map **maps,
const char *symbol_name, u64 addr) const char *symbol_name, u64 addr)
{ {
char *bracket; char *bracket;
enum map_type i; int i;
struct ref_reloc_sym *ref; struct ref_reloc_sym *ref;
ref = zalloc(sizeof(struct ref_reloc_sym)); ref = zalloc(sizeof(struct ref_reloc_sym));
......
...@@ -32,7 +32,6 @@ EXTRA_WARNINGS += -Wold-style-definition ...@@ -32,7 +32,6 @@ EXTRA_WARNINGS += -Wold-style-definition
EXTRA_WARNINGS += -Wpacked EXTRA_WARNINGS += -Wpacked
EXTRA_WARNINGS += -Wredundant-decls EXTRA_WARNINGS += -Wredundant-decls
EXTRA_WARNINGS += -Wshadow EXTRA_WARNINGS += -Wshadow
EXTRA_WARNINGS += -Wstrict-aliasing=3
EXTRA_WARNINGS += -Wstrict-prototypes EXTRA_WARNINGS += -Wstrict-prototypes
EXTRA_WARNINGS += -Wswitch-default EXTRA_WARNINGS += -Wswitch-default
EXTRA_WARNINGS += -Wswitch-enum EXTRA_WARNINGS += -Wswitch-enum
...@@ -40,6 +39,10 @@ EXTRA_WARNINGS += -Wundef ...@@ -40,6 +39,10 @@ EXTRA_WARNINGS += -Wundef
EXTRA_WARNINGS += -Wwrite-strings EXTRA_WARNINGS += -Wwrite-strings
EXTRA_WARNINGS += -Wformat EXTRA_WARNINGS += -Wformat
ifneq ($(CC), clang)
EXTRA_WARNINGS += -Wstrict-aliasing=3
endif
ifneq ($(findstring $(MAKEFLAGS), w),w) ifneq ($(findstring $(MAKEFLAGS), w),w)
PRINT_DIR = --no-print-directory PRINT_DIR = --no-print-directory
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment