2009-10-05 20:26:43

by Randy Dunlap

[permalink] [raw]
Subject: [patch] perf build questions

Hi,

How do I build 'perf' for an i386 target when running on x86_64?
and how do I do 'perf' cross-builds in general?


Also, I see build errors/warnings (-Werror). Others aren't seeing these?
Just due to my gcc version?

Patch below.

Thanks.
---

From: Randy Dunlap <[email protected]>

Fix perf build warnings/errors in function argument types:

builtin-sched.c:1894: warning: passing argument 1 of 'sort_dimension__add' discards qualifiers from pointer target type
util/trace-event-parse.c:685: warning: passing argument 2 of 'read_expected' discards qualifiers from pointer target type
util/trace-event-parse.c:741: warning: passing argument 4 of 'test_type_token' discards qualifiers from pointer target type
util/trace-event-parse.c:706: warning: passing argument 2 of 'read_expected_item' discards qualifiers from pointer target type

Signed-off-by: Randy Dunlap <[email protected]>
---
tools/perf/builtin-sched.c | 2 +-
tools/perf/util/trace-event-parse.c | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)

--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -1287,7 +1287,7 @@ static struct sort_dimension *available_

static LIST_HEAD(sort_list);

-static int sort_dimension__add(char *tok, struct list_head *list)
+static int sort_dimension__add(const char *tok, struct list_head *list)
{
int i;

--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -618,7 +618,7 @@ static int test_type(enum event_type typ
}

static int test_type_token(enum event_type type, char *token,
- enum event_type expect, char *expect_tok)
+ enum event_type expect, const char *expect_tok)
{
if (type != expect) {
die("Error: expected type %d but read %d",
@@ -650,7 +650,7 @@ static int read_expect_type(enum event_t
return __read_expect_type(expect, tok, 1);
}

-static int __read_expected(enum event_type expect, char *str, int newline_ok)
+static int __read_expected(enum event_type expect, const char *str, int newline_ok)
{
enum event_type type;
char *token;
@@ -668,12 +668,12 @@ static int __read_expected(enum event_ty
return 0;
}

-static int read_expected(enum event_type expect, char *str)
+static int read_expected(enum event_type expect, const char *str)
{
return __read_expected(expect, str, 1);
}

-static int read_expected_item(enum event_type expect, char *str)
+static int read_expected_item(enum event_type expect, const char *str)
{
return __read_expected(expect, str, 0);
}


2009-10-05 20:47:45

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [patch] perf build questions

On Mon, Oct 05, 2009 at 01:17:29PM -0700, Randy Dunlap wrote:
> Hi,
>
> How do I build 'perf' for an i386 target when running on x86_64?
> and how do I do 'perf' cross-builds in general?
>


I let someone else who knows that better than me answer to that.
But you may need to override the CC var in the makefile for now.
This is something we should make tunable.


> Also, I see build errors/warnings (-Werror). Others aren't seeing these?
> Just due to my gcc version?
>
> Patch below.
>
> Thanks.


Oh thanks. I've never seen them.

The builtin-sched.c warning is right.
But the util/trace-event-parse.c warnings are wrong since the parameters
passed to these functions are always cast to char *

But that is wrong too, these functions should take const char * and
not char * as they never need to touch these strings.

So your patch is correct, I'll just convert the callsites. It's
my bad, I've put these casts to shutdown such warnings while integrating
the trace-cmd lib. I was distracted by harder integration problems.

Thanks.

Acked-by: Frederic Weisbecker <[email protected]>


> From: Randy Dunlap <[email protected]>
>
> Fix perf build warnings/errors in function argument types:
>
> builtin-sched.c:1894: warning: passing argument 1 of 'sort_dimension__add' discards qualifiers from pointer target type
> util/trace-event-parse.c:685: warning: passing argument 2 of 'read_expected' discards qualifiers from pointer target type
> util/trace-event-parse.c:741: warning: passing argument 4 of 'test_type_token' discards qualifiers from pointer target type
> util/trace-event-parse.c:706: warning: passing argument 2 of 'read_expected_item' discards qualifiers from pointer target type
>
> Signed-off-by: Randy Dunlap <[email protected]>
> ---
> tools/perf/builtin-sched.c | 2 +-
> tools/perf/util/trace-event-parse.c | 8 ++++----
> 2 files changed, 5 insertions(+), 5 deletions(-)
>
> --- a/tools/perf/builtin-sched.c
> +++ b/tools/perf/builtin-sched.c
> @@ -1287,7 +1287,7 @@ static struct sort_dimension *available_
>
> static LIST_HEAD(sort_list);
>
> -static int sort_dimension__add(char *tok, struct list_head *list)
> +static int sort_dimension__add(const char *tok, struct list_head *list)
> {
> int i;
>
> --- a/tools/perf/util/trace-event-parse.c
> +++ b/tools/perf/util/trace-event-parse.c
> @@ -618,7 +618,7 @@ static int test_type(enum event_type typ
> }
>
> static int test_type_token(enum event_type type, char *token,
> - enum event_type expect, char *expect_tok)
> + enum event_type expect, const char *expect_tok)
> {
> if (type != expect) {
> die("Error: expected type %d but read %d",
> @@ -650,7 +650,7 @@ static int read_expect_type(enum event_t
> return __read_expect_type(expect, tok, 1);
> }
>
> -static int __read_expected(enum event_type expect, char *str, int newline_ok)
> +static int __read_expected(enum event_type expect, const char *str, int newline_ok)
> {
> enum event_type type;
> char *token;
> @@ -668,12 +668,12 @@ static int __read_expected(enum event_ty
> return 0;
> }
>
> -static int read_expected(enum event_type expect, char *str)
> +static int read_expected(enum event_type expect, const char *str)
> {
> return __read_expected(expect, str, 1);
> }
>
> -static int read_expected_item(enum event_type expect, char *str)
> +static int read_expected_item(enum event_type expect, const char *str)
> {
> return __read_expected(expect, str, 0);
> }
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/

2009-10-06 08:49:35

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [patch] perf build questions

On Mon, 2009-10-05 at 13:17 -0700, Randy Dunlap wrote:
> Hi,
>
> How do I build 'perf' for an i386 target when running on x86_64?

make NO_64BIT=1

> and how do I do 'perf' cross-builds in general?

make CC=arm-linux-gcc AR=arm-linux-ar STRIP=arm-linux-strip

I think,.. but I don't have full cross build environments, just the bare
binutils+gcc bits to cross build kernels.

> Also, I see build errors/warnings (-Werror). Others aren't seeing these?
> Just due to my gcc version?

Didn't see any here, but what frederic said..

2009-10-06 17:35:17

by Randy Dunlap

[permalink] [raw]
Subject: Re: [patch] perf build questions

On Tue, 06 Oct 2009 10:48:59 +0200 Peter Zijlstra wrote:

> On Mon, 2009-10-05 at 13:17 -0700, Randy Dunlap wrote:
> > Hi,
> >
> > How do I build 'perf' for an i386 target when running on x86_64?
>
> make NO_64BIT=1

$ make NO_64BIT=1 all
$ file perf
perf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped


Shouldn't that be a 32-bit executable for i386?
Am I confused? (you don't have to answer that)


> > and how do I do 'perf' cross-builds in general?
>
> make CC=arm-linux-gcc AR=arm-linux-ar STRIP=arm-linux-strip
>
> I think,.. but I don't have full cross build environments, just the bare
> binutils+gcc bits to cross build kernels.
>
> > Also, I see build errors/warnings (-Werror). Others aren't seeing these?
> > Just due to my gcc version?
>
> Didn't see any here, but what frederic said..



---
~Randy

2009-10-06 18:03:26

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [patch] perf build questions

On Tue, 2009-10-06 at 10:26 -0700, Randy Dunlap wrote:
> On Tue, 06 Oct 2009 10:48:59 +0200 Peter Zijlstra wrote:
>
> > On Mon, 2009-10-05 at 13:17 -0700, Randy Dunlap wrote:
> > > Hi,
> > >
> > > How do I build 'perf' for an i386 target when running on x86_64?
> >
> > make NO_64BIT=1
>
> $ make NO_64BIT=1 all
> $ file perf
> perf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped
>
>
> Shouldn't that be a 32-bit executable for i386?
> Am I confused? (you don't have to answer that)

# uname -a
Linux twins 2.6.31-tip #212 SMP PREEMPT Tue Sep 22 12:02:22 CEST 2009
x86_64 GNU/Linux
# rm perf
# make NO_64BIT=1 perf
# file perf
perf: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not
stripped


seems to work for me...


2009-10-06 18:06:33

by Kyle McMartin

[permalink] [raw]
Subject: Re: [patch] perf build questions

On Tue, Oct 06, 2009 at 10:26:26AM -0700, Randy Dunlap wrote:
> $ make NO_64BIT=1 all
> $ file perf
> perf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped
>
>
> Shouldn't that be a 32-bit executable for i386?
> Am I confused? (you don't have to answer that)
>

Are you running a 32-bit userspace, with x86_64 kernel? Or running
x86_64 userspace as well and trying to crossbuild for i386? In the
latter case NO_64BIT won't do what you hope, it's to avoid trying to
build a 64-bit binary in the former case.

You could force -m32 into CFLAGS in the second case, but unless you have
the proper i386 bi-arch toolchain installed (glibc, etc.) it likely
won't build...

regards, Kyle

2009-10-06 18:18:50

by Randy Dunlap

[permalink] [raw]
Subject: Re: [patch] perf build questions

On Tue, 6 Oct 2009 14:05:51 -0400 Kyle McMartin wrote:

> On Tue, Oct 06, 2009 at 10:26:26AM -0700, Randy Dunlap wrote:
> > $ make NO_64BIT=1 all
> > $ file perf
> > perf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped
> >
> >
> > Shouldn't that be a 32-bit executable for i386?
> > Am I confused? (you don't have to answer that)
> >
>
> Are you running a 32-bit userspace, with x86_64 kernel? Or running
> x86_64 userspace as well and trying to crossbuild for i386? In the
> latter case NO_64BIT won't do what you hope, it's to avoid trying to
> build a 64-bit binary in the former case.

All 64-bit userspace & kernel. so that fails. Thanks.

> You could force -m32 into CFLAGS in the second case, but unless you have
> the proper i386 bi-arch toolchain installed (glibc, etc.) it likely
> won't build...

I'll test/check etc.

---
~Randy

2009-10-12 06:36:32

by Ingo Molnar

[permalink] [raw]
Subject: Re: [patch] perf build questions


* Randy Dunlap <[email protected]> wrote:

> Also, I see build errors/warnings (-Werror). Others aren't seeing these?
> Just due to my gcc version?

Thanks for the fix. Which GCC version is this btw?

Ingo

2009-10-12 06:53:30

by Randy Dunlap

[permalink] [raw]
Subject: [tip:perf/urgent] perf tools: Fix const char type propagation

Commit-ID: cbef79a82a64ec13e745ce2b0274154ae1e47243
Gitweb: http://git.kernel.org/tip/cbef79a82a64ec13e745ce2b0274154ae1e47243
Author: Randy Dunlap <[email protected]>
AuthorDate: Mon, 5 Oct 2009 13:17:29 -0700
Committer: Ingo Molnar <[email protected]>
CommitDate: Mon, 12 Oct 2009 08:35:00 +0200

perf tools: Fix const char type propagation

The following perf build warnings/errors in function
argument types:

builtin-sched.c:1894: warning: passing argument 1 of 'sort_dimension__add' discards qualifiers from pointer target type
util/trace-event-parse.c:685: warning: passing argument 2 of 'read_expected' discards qualifiers from pointer target type
util/trace-event-parse.c:741: warning: passing argument 4 of 'test_type_token' discards qualifiers from pointer target type
util/trace-event-parse.c:706: warning: passing argument 2 of 'read_expected_item' discards qualifiers from pointer target type

... trigger because older GCC is not able to prove that
sort_dimension__add() does not change the string.

Some goes for test_type_token().

Fix this by improving type consistency.

Signed-off-by: Randy Dunlap <[email protected]>
Acked-by: Frederic Weisbecker <[email protected]>
Acked-by: Peter Zijlstra <[email protected]>
Cc: Paul Mackerras <[email protected]>
LKML-Reference: <[email protected]>
[ Also remove ugly type cast now unnecessary. ]
Signed-off-by: Ingo Molnar <[email protected]>
---
tools/perf/builtin-sched.c | 4 ++--
tools/perf/util/trace-event-parse.c | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index ea9c15c..ce2d5be 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -1287,7 +1287,7 @@ static struct sort_dimension *available_sorts[] = {

static LIST_HEAD(sort_list);

-static int sort_dimension__add(char *tok, struct list_head *list)
+static int sort_dimension__add(const char *tok, struct list_head *list)
{
int i;

@@ -1917,7 +1917,7 @@ static void setup_sorting(void)

free(str);

- sort_dimension__add((char *)"pid", &cmp_pid);
+ sort_dimension__add("pid", &cmp_pid);
}

static const char *record_args[] = {
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c
index 55b41b9..55c9659 100644
--- a/tools/perf/util/trace-event-parse.c
+++ b/tools/perf/util/trace-event-parse.c
@@ -618,7 +618,7 @@ static int test_type(enum event_type type, enum event_type expect)
}

static int test_type_token(enum event_type type, char *token,
- enum event_type expect, char *expect_tok)
+ enum event_type expect, const char *expect_tok)
{
if (type != expect) {
die("Error: expected type %d but read %d",
@@ -650,7 +650,7 @@ static int read_expect_type(enum event_type expect, char **tok)
return __read_expect_type(expect, tok, 1);
}

-static int __read_expected(enum event_type expect, char *str, int newline_ok)
+static int __read_expected(enum event_type expect, const char *str, int newline_ok)
{
enum event_type type;
char *token;
@@ -668,12 +668,12 @@ static int __read_expected(enum event_type expect, char *str, int newline_ok)
return 0;
}

-static int read_expected(enum event_type expect, char *str)
+static int read_expected(enum event_type expect, const char *str)
{
return __read_expected(expect, str, 1);
}

-static int read_expected_item(enum event_type expect, char *str)
+static int read_expected_item(enum event_type expect, const char *str)
{
return __read_expected(expect, str, 0);
}

2009-10-12 08:48:22

by Ingo Molnar

[permalink] [raw]
Subject: Re: [patch] perf build questions


* Randy Dunlap <[email protected]> wrote:

> All 64-bit userspace & kernel. so that fails. Thanks.

btw., i'm curious, what was/is your motivation for cross-building in
that way? On a 64-bit system you really want a 64-bit perf binary - it's
faster.

Ingo

2009-10-12 15:34:45

by Randy Dunlap

[permalink] [raw]
Subject: Re: [patch] perf build questions

On Mon, 12 Oct 2009 08:35:47 +0200 Ingo Molnar wrote:

>
> * Randy Dunlap <[email protected]> wrote:
>
> > Also, I see build errors/warnings (-Werror). Others aren't seeing these?
> > Just due to my gcc version?
>
> Thanks for the fix. Which GCC version is this btw?

gcc (GCC) 4.2.1 (SUSE Linux)
(from some openSUSE.org release)

---
~Randy

2009-10-12 15:37:13

by Randy Dunlap

[permalink] [raw]
Subject: Re: [patch] perf build questions

On Mon, 12 Oct 2009 10:47:34 +0200 Ingo Molnar wrote:

>
> * Randy Dunlap <[email protected]> wrote:
>
> > All 64-bit userspace & kernel. so that fails. Thanks.
>
> btw., i'm curious, what was/is your motivation for cross-building in
> that way? On a 64-bit system you really want a 64-bit perf binary - it's
> faster.

I'm just trying to build 64-bit and 32-bit RPMs.

Thanks.
---
~Randy