Commit 4643b056 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Ingo Molnar.

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86: Handle failures of parsing immediate operands in the instruction decoder
  perf archive: Correct cutting of symbolic link
  perf tools: Ignore auto-generated bison/flex files
  perf tools: Fix parsers' rules to dependencies
  perf tools: fix NO_GTK2 Makefile config error
  perf session: Skip event correctly for unknown id/machine
parents cdd59830 6c7b8e82
...@@ -379,8 +379,8 @@ void insn_get_displacement(struct insn *insn) ...@@ -379,8 +379,8 @@ void insn_get_displacement(struct insn *insn)
return; return;
} }
/* Decode moffset16/32/64 */ /* Decode moffset16/32/64. Return 0 if failed */
static void __get_moffset(struct insn *insn) static int __get_moffset(struct insn *insn)
{ {
switch (insn->addr_bytes) { switch (insn->addr_bytes) {
case 2: case 2:
...@@ -397,15 +397,19 @@ static void __get_moffset(struct insn *insn) ...@@ -397,15 +397,19 @@ static void __get_moffset(struct insn *insn)
insn->moffset2.value = get_next(int, insn); insn->moffset2.value = get_next(int, insn);
insn->moffset2.nbytes = 4; insn->moffset2.nbytes = 4;
break; break;
default: /* opnd_bytes must be modified manually */
goto err_out;
} }
insn->moffset1.got = insn->moffset2.got = 1; insn->moffset1.got = insn->moffset2.got = 1;
return 1;
err_out: err_out:
return; return 0;
} }
/* Decode imm v32(Iz) */ /* Decode imm v32(Iz). Return 0 if failed */
static void __get_immv32(struct insn *insn) static int __get_immv32(struct insn *insn)
{ {
switch (insn->opnd_bytes) { switch (insn->opnd_bytes) {
case 2: case 2:
...@@ -417,14 +421,18 @@ static void __get_immv32(struct insn *insn) ...@@ -417,14 +421,18 @@ static void __get_immv32(struct insn *insn)
insn->immediate.value = get_next(int, insn); insn->immediate.value = get_next(int, insn);
insn->immediate.nbytes = 4; insn->immediate.nbytes = 4;
break; break;
default: /* opnd_bytes must be modified manually */
goto err_out;
} }
return 1;
err_out: err_out:
return; return 0;
} }
/* Decode imm v64(Iv/Ov) */ /* Decode imm v64(Iv/Ov), Return 0 if failed */
static void __get_immv(struct insn *insn) static int __get_immv(struct insn *insn)
{ {
switch (insn->opnd_bytes) { switch (insn->opnd_bytes) {
case 2: case 2:
...@@ -441,15 +449,18 @@ static void __get_immv(struct insn *insn) ...@@ -441,15 +449,18 @@ static void __get_immv(struct insn *insn)
insn->immediate2.value = get_next(int, insn); insn->immediate2.value = get_next(int, insn);
insn->immediate2.nbytes = 4; insn->immediate2.nbytes = 4;
break; break;
default: /* opnd_bytes must be modified manually */
goto err_out;
} }
insn->immediate1.got = insn->immediate2.got = 1; insn->immediate1.got = insn->immediate2.got = 1;
return 1;
err_out: err_out:
return; return 0;
} }
/* Decode ptr16:16/32(Ap) */ /* Decode ptr16:16/32(Ap) */
static void __get_immptr(struct insn *insn) static int __get_immptr(struct insn *insn)
{ {
switch (insn->opnd_bytes) { switch (insn->opnd_bytes) {
case 2: case 2:
...@@ -462,14 +473,17 @@ static void __get_immptr(struct insn *insn) ...@@ -462,14 +473,17 @@ static void __get_immptr(struct insn *insn)
break; break;
case 8: case 8:
/* ptr16:64 is not exist (no segment) */ /* ptr16:64 is not exist (no segment) */
return; return 0;
default: /* opnd_bytes must be modified manually */
goto err_out;
} }
insn->immediate2.value = get_next(unsigned short, insn); insn->immediate2.value = get_next(unsigned short, insn);
insn->immediate2.nbytes = 2; insn->immediate2.nbytes = 2;
insn->immediate1.got = insn->immediate2.got = 1; insn->immediate1.got = insn->immediate2.got = 1;
return 1;
err_out: err_out:
return; return 0;
} }
/** /**
...@@ -489,7 +503,8 @@ void insn_get_immediate(struct insn *insn) ...@@ -489,7 +503,8 @@ void insn_get_immediate(struct insn *insn)
insn_get_displacement(insn); insn_get_displacement(insn);
if (inat_has_moffset(insn->attr)) { if (inat_has_moffset(insn->attr)) {
__get_moffset(insn); if (!__get_moffset(insn))
goto err_out;
goto done; goto done;
} }
...@@ -517,16 +532,20 @@ void insn_get_immediate(struct insn *insn) ...@@ -517,16 +532,20 @@ void insn_get_immediate(struct insn *insn)
insn->immediate2.nbytes = 4; insn->immediate2.nbytes = 4;
break; break;
case INAT_IMM_PTR: case INAT_IMM_PTR:
__get_immptr(insn); if (!__get_immptr(insn))
goto err_out;
break; break;
case INAT_IMM_VWORD32: case INAT_IMM_VWORD32:
__get_immv32(insn); if (!__get_immv32(insn))
goto err_out;
break; break;
case INAT_IMM_VWORD: case INAT_IMM_VWORD:
__get_immv(insn); if (!__get_immv(insn))
goto err_out;
break; break;
default: default:
break; /* Here, insn must have an immediate, but failed */
goto err_out;
} }
if (inat_has_second_immediate(insn->attr)) { if (inat_has_second_immediate(insn->attr)) {
insn->immediate2.value = get_next(char, insn); insn->immediate2.value = get_next(char, insn);
......
...@@ -19,3 +19,5 @@ TAGS ...@@ -19,3 +19,5 @@ TAGS
cscope* cscope*
config.mak config.mak
config.mak.autogen config.mak.autogen
*-bison.*
*-flex.*
...@@ -237,21 +237,20 @@ export PERL_PATH ...@@ -237,21 +237,20 @@ export PERL_PATH
FLEX = $(CROSS_COMPILE)flex FLEX = $(CROSS_COMPILE)flex
BISON= $(CROSS_COMPILE)bison BISON= $(CROSS_COMPILE)bison
event-parser: $(OUTPUT)util/parse-events-flex.c: util/parse-events.l
$(QUIET_BISON)$(BISON) -v util/parse-events.y -d -o $(OUTPUT)util/parse-events-bison.c
$(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/parse-events-flex.h -t util/parse-events.l > $(OUTPUT)util/parse-events-flex.c $(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/parse-events-flex.h -t util/parse-events.l > $(OUTPUT)util/parse-events-flex.c
$(OUTPUT)util/parse-events-flex.c: event-parser $(OUTPUT)util/parse-events-bison.c: util/parse-events.y
$(OUTPUT)util/parse-events-bison.c: event-parser $(QUIET_BISON)$(BISON) -v util/parse-events.y -d -o $(OUTPUT)util/parse-events-bison.c
pmu-parser: $(OUTPUT)util/pmu-flex.c: util/pmu.l
$(QUIET_BISON)$(BISON) -v util/pmu.y -d -o $(OUTPUT)util/pmu-bison.c
$(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/pmu-flex.h -t util/pmu.l > $(OUTPUT)util/pmu-flex.c $(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/pmu-flex.h -t util/pmu.l > $(OUTPUT)util/pmu-flex.c
$(OUTPUT)util/pmu-flex.c: pmu-parser $(OUTPUT)util/pmu-bison.c: util/pmu.y
$(OUTPUT)util/pmu-bison.c: pmu-parser $(QUIET_BISON)$(BISON) -v util/pmu.y -d -o $(OUTPUT)util/pmu-bison.c
$(OUTPUT)util/parse-events.o: event-parser pmu-parser $(OUTPUT)util/parse-events.o: $(OUTPUT)util/parse-events-flex.c $(OUTPUT)util/parse-events-bison.c
$(OUTPUT)util/pmu.o: $(OUTPUT)util/pmu-flex.c $(OUTPUT)util/pmu-bison.c
LIB_FILE=$(OUTPUT)libperf.a LIB_FILE=$(OUTPUT)libperf.a
...@@ -527,7 +526,7 @@ else ...@@ -527,7 +526,7 @@ else
endif endif
ifdef NO_GTK2 ifdef NO_GTK2
BASIC_CFLAGS += -DNO_GTK2 BASIC_CFLAGS += -DNO_GTK2_SUPPORT
else else
FLAGS_GTK2=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) $(shell pkg-config --libs --cflags gtk+-2.0) FLAGS_GTK2=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) $(shell pkg-config --libs --cflags gtk+-2.0)
ifneq ($(call try-cc,$(SOURCE_GTK2),$(FLAGS_GTK2)),y) ifneq ($(call try-cc,$(SOURCE_GTK2),$(FLAGS_GTK2)),y)
...@@ -852,8 +851,6 @@ help: ...@@ -852,8 +851,6 @@ help:
@echo ' html - make html documentation' @echo ' html - make html documentation'
@echo ' info - make GNU info documentation (access with info <foo>)' @echo ' info - make GNU info documentation (access with info <foo>)'
@echo ' pdf - make pdf documentation' @echo ' pdf - make pdf documentation'
@echo ' event-parser - make event parser code'
@echo ' pmu-parser - make pmu format parser code'
@echo ' TAGS - use etags to make tag information for source browsing' @echo ' TAGS - use etags to make tag information for source browsing'
@echo ' tags - use ctags to make tag information for source browsing' @echo ' tags - use ctags to make tag information for source browsing'
@echo ' cscope - use cscope to make interactive browsing database' @echo ' cscope - use cscope to make interactive browsing database'
......
...@@ -29,13 +29,14 @@ if [ ! -s $BUILDIDS ] ; then ...@@ -29,13 +29,14 @@ if [ ! -s $BUILDIDS ] ; then
fi fi
MANIFEST=$(mktemp /tmp/perf-archive-manifest.XXXXXX) MANIFEST=$(mktemp /tmp/perf-archive-manifest.XXXXXX)
PERF_BUILDID_LINKDIR=$(readlink -f $PERF_BUILDID_DIR)/
cut -d ' ' -f 1 $BUILDIDS | \ cut -d ' ' -f 1 $BUILDIDS | \
while read build_id ; do while read build_id ; do
linkname=$PERF_BUILDID_DIR.build-id/${build_id:0:2}/${build_id:2} linkname=$PERF_BUILDID_DIR.build-id/${build_id:0:2}/${build_id:2}
filename=$(readlink -f $linkname) filename=$(readlink -f $linkname)
echo ${linkname#$PERF_BUILDID_DIR} >> $MANIFEST echo ${linkname#$PERF_BUILDID_DIR} >> $MANIFEST
echo ${filename#$PERF_BUILDID_DIR} >> $MANIFEST echo ${filename#$PERF_BUILDID_LINKDIR} >> $MANIFEST
done done
tar cfj $PERF_DATA.tar.bz2 -C $PERF_BUILDID_DIR -T $MANIFEST tar cfj $PERF_DATA.tar.bz2 -C $PERF_BUILDID_DIR -T $MANIFEST
......
...@@ -876,11 +876,11 @@ static int perf_session_deliver_event(struct perf_session *session, ...@@ -876,11 +876,11 @@ static int perf_session_deliver_event(struct perf_session *session,
dump_sample(session, event, sample); dump_sample(session, event, sample);
if (evsel == NULL) { if (evsel == NULL) {
++session->hists.stats.nr_unknown_id; ++session->hists.stats.nr_unknown_id;
return -1; return 0;
} }
if (machine == NULL) { if (machine == NULL) {
++session->hists.stats.nr_unprocessable_samples; ++session->hists.stats.nr_unprocessable_samples;
return -1; return 0;
} }
return tool->sample(tool, event, sample, evsel, machine); return tool->sample(tool, event, sample, evsel, machine);
case PERF_RECORD_MMAP: case PERF_RECORD_MMAP:
......
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