mailing list of musl libc
 help / color / mirror / code / Atom feed
* compiling SPECCPU2006 against Musl
@ 2018-10-13 21:47 K Jelesnianski
  2018-10-14  1:51 ` Rich Felker
  0 siblings, 1 reply; 2+ messages in thread
From: K Jelesnianski @ 2018-10-13 21:47 UTC (permalink / raw)
  To: musl

[-- Attachment #1: Type: text/plain, Size: 4386 bytes --]

Dear mailing list,

I am curious if anyone has any insight on how to link the SPECCPU2006
benchmarks against Lusl Libc. Reading FAQ I saw that Musl does *not* have
C++ support out of the box but can still "hopefully" work in some cases
against glibstdc++
I havent found any resources or guides on-line of people doing this.

Anyways I am only focusing on the C implementation SPEC benchmarks and out
of this subset I was still only able to compile a few. The following do not
compile against MUSL:
400.perlbench
403.gcc
462.libquantum

I tried to use both clang 6.0.0 and gcc and got the following error below
(Dump at end of email). Any thoughts?
for perlbench - at first was "undefined reference to __isnan" but then
after adding -I/path/to/musl/install/include I got even more errors. I am
using the -std=gnu89 flag since this was how SPEC documented its fix for a
multiple definition error. The other 2 benchmarks show similar errors.

Sincerely,
K Jelesnianski

Error Dump for perlbench:

clang -c -o perlio.o -DSPEC_CPU -DNDEBUG -DPERL_CORE   -O2
-fno-strict-aliasing -g -fPIC -fomit-frame-pointer
-I/home/c/workspace/research/mardu/bin/include       -DSPEC_CPU_LP64
-DSPEC_CPU_LINUX_X64 -std=gnu89        perlio.c
In file included from perlio.c:50:
In file included from ./perl.h:384:
In file included from
/home/c/workspace/research/mardu/bin/include/sys/types.h:70:
/home/c/workspace/research/mardu/bin/include/endian.h:32:25: warning:
'&' within '|' [-Wbitwise-op-parentheses]
        return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
                       ~ ~~~~~~^~~~~~~
/home/c/workspace/research/mardu/bin/include/endian.h:32:25: note:
place parentheses around the '&' expression to silence this warning
        return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
                               ^
                         (            )
/home/c/workspace/research/mardu/bin/include/endian.h:32:41: warning:
'&' within '|' [-Wbitwise-op-parentheses]
        return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
                                       ~ ~~~~~~^~~~~~~~~
/home/c/workspace/research/mardu/bin/include/endian.h:32:41: note:
place parentheses around the '&' expression to silence this warning
        return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
                                               ^
                                         (              )
/home/c/workspace/research/mardu/bin/include/endian.h:37:23: warning:
operator '<<' has lower precedence than '+'; '+' will be evaluated
first [-Wshift-op-parentheses]
        return __bswap32(__x)+0ULL<<32 | __bswap32(__x>>32);
               ~~~~~~~~~~~~~~^~~~~~~
/home/c/workspace/research/mardu/bin/include/endian.h:37:23: note:
place parentheses around the '+' expression to silence this warning
        return __bswap32(__x)+0ULL<<32 | __bswap32(__x>>32);
                             ^
               (                  )
perlio.c:2308:21: error: use of undeclared identifier 'O_TRUNC'; did
you mean 'OP_TRANS'?
        oflags = O_CREAT | O_TRUNC;
                           ^~~~~~~
                           OP_TRANS
./opnames.h:51:2: note: 'OP_TRANS' declared here
        OP_TRANS,       /* 35 */
        ^
perlio.c:2318:21: error: use of undeclared identifier 'O_APPEND'
        oflags = O_CREAT | O_APPEND;
                           ^
perlio.c:3046:28: error: incomplete definition of type 'struct _IO_FILE'
        STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
                                  ^~~~~~~~~~~~~~~~~~
./iperlsys.h:305:29: note: expanded from macro 'PerlSIO_get_ptr'
#define PerlSIO_get_ptr(f)              FILE_ptr(f)
                                        ^~~~~~~~~~~
./spec_config.h:814:30: note: expanded from macro 'FILE_ptr'
#   define FILE_ptr(fp) ((fp)->_IO_read_ptr)
                         ~~~~^
/home/c/workspace/research/mardu/bin/include/bits/alltypes.h:356:16:
note: forward declaration of 'struct _IO_FILE'
typedef struct _IO_FILE FILE;
               ^
perlio.c:3054:20: error: incomplete definition of type 'struct _IO_FILE'
            if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr &
0xFF) != ch)) {
                          ^~~~~~~~~~~~~~~~~~
./iperlsys.h:305:29: note: expanded from macro 'PerlSIO_get_ptr'
#define PerlSIO_get_ptr(f)              FILE_ptr(f)
                                        ^~~~~~~~~~~

[-- Attachment #2: Type: text/html, Size: 18674 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: compiling SPECCPU2006 against Musl
  2018-10-13 21:47 compiling SPECCPU2006 against Musl K Jelesnianski
@ 2018-10-14  1:51 ` Rich Felker
  0 siblings, 0 replies; 2+ messages in thread
From: Rich Felker @ 2018-10-14  1:51 UTC (permalink / raw)
  To: K Jelesnianski; +Cc: musl

On Sat, Oct 13, 2018 at 05:47:50PM -0400, K Jelesnianski wrote:
> Dear mailing list,
> 
> I am curious if anyone has any insight on how to link the SPECCPU2006
> benchmarks against Lusl Libc. Reading FAQ I saw that Musl does *not* have
> C++ support out of the box but can still "hopefully" work in some cases
> against glibstdc++
> I havent found any resources or guides on-line of people doing this.

I would not describe it as "musl does not have C++ support". Rather,
musl is not an implementation of the C++ stdlib (and neither is
glibc), but that just means you use whichever C++ stdlib you want with
it (GCC's libstdc++ or the llvm-associated libc++).

> Anyways I am only focusing on the C implementation SPEC benchmarks and out
> of this subset I was still only able to compile a few. The following do not
> compile against MUSL:
> 400.perlbench
> 403.gcc
> 462.libquantum
> 
> I tried to use both clang 6.0.0 and gcc and got the following error below
> (Dump at end of email). Any thoughts?
> for perlbench - at first was "undefined reference to __isnan" but then
> after adding -I/path/to/musl/install/include I got even more errors. I am
> using the -std=gnu89 flag since this was how SPEC documented its fix for a
> multiple definition error. The other 2 benchmarks show similar errors.

It sounds like something is wrong with your setup for making the
toolchain target musl. Repurposing an existing toolchain that's
pulling in library and include dirs from whatever your existing host
libc is (presumably glibc) is hard to get right. See below:

> Sincerely,
> K Jelesnianski
> 
> Error Dump for perlbench:
> 
> clang -c -o perlio.o -DSPEC_CPU -DNDEBUG -DPERL_CORE   -O2
> -fno-strict-aliasing -g -fPIC -fomit-frame-pointer
> -I/home/c/workspace/research/mardu/bin/include       -DSPEC_CPU_LP64
> -DSPEC_CPU_LINUX_X64 -std=gnu89        perlio.c
> In file included from perlio.c:50:
> In file included from ./perl.h:384:
> In file included from
> /home/c/workspace/research/mardu/bin/include/sys/types.h:70:
> /home/c/workspace/research/mardu/bin/include/endian.h:32:25: warning:
> '&' within '|' [-Wbitwise-op-parentheses]
>         return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
>                        ~ ~~~~~~^~~~~~~
> /home/c/workspace/research/mardu/bin/include/endian.h:32:25: note:
> place parentheses around the '&' expression to silence this warning
>         return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
>                                ^
>                          (            )
> /home/c/workspace/research/mardu/bin/include/endian.h:32:41: warning:
> '&' within '|' [-Wbitwise-op-parentheses]
>         return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
>                                        ~ ~~~~~~^~~~~~~~~
> /home/c/workspace/research/mardu/bin/include/endian.h:32:41: note:
> place parentheses around the '&' expression to silence this warning
>         return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
>                                                ^
>                                          (              )
> /home/c/workspace/research/mardu/bin/include/endian.h:37:23: warning:
> operator '<<' has lower precedence than '+'; '+' will be evaluated
> first [-Wshift-op-parentheses]
>         return __bswap32(__x)+0ULL<<32 | __bswap32(__x>>32);
>                ~~~~~~~~~~~~~~^~~~~~~
> /home/c/workspace/research/mardu/bin/include/endian.h:37:23: note:
> place parentheses around the '+' expression to silence this warning
>         return __bswap32(__x)+0ULL<<32 | __bswap32(__x>>32);
>                              ^
>                (                  )

The compiler should not produce style warnings for macros expanded
from system headers, but I believe this is a known clang misfeature.
In any case this one is just a warning.

> perlio.c:2308:21: error: use of undeclared identifier 'O_TRUNC'; did
> you mean 'OP_TRANS'?
>         oflags = O_CREAT | O_TRUNC;
>                            ^~~~~~~
>                            OP_TRANS
> ../opnames.h:51:2: note: 'OP_TRANS' declared here
>         OP_TRANS,       /* 35 */
>         ^
> perlio.c:2318:21: error: use of undeclared identifier 'O_APPEND'
>         oflags = O_CREAT | O_APPEND;
>                            ^

No idea how O_CREAT was defined but O_TRUNC and O_APPEND were not.
This sounds like either perlio.h failed to include fcntl.h and
something else provided a fallback definition of O_CREAT, or you have
a corrupted installation of the musl headers.

> perlio.c:3046:28: error: incomplete definition of type 'struct _IO_FILE'
>         STDCHAR *eptr = (STDCHAR*)PerlSIO_get_ptr(s);
>                                   ^~~~~~~~~~~~~~~~~~
> ../iperlsys.h:305:29: note: expanded from macro 'PerlSIO_get_ptr'
> #define PerlSIO_get_ptr(f)              FILE_ptr(f)
>                                         ^~~~~~~~~~~
> ../spec_config.h:814:30: note: expanded from macro 'FILE_ptr'
> #   define FILE_ptr(fp) ((fp)->_IO_read_ptr)
>                          ~~~~^
> /home/c/workspace/research/mardu/bin/include/bits/alltypes.h:356:16:
> note: forward declaration of 'struct _IO_FILE'
> typedef struct _IO_FILE FILE;
>                ^
> perlio.c:3054:20: error: incomplete definition of type 'struct _IO_FILE'
>             if ((STDCHAR*)PerlSIO_get_ptr(s) != --eptr || ((*eptr &
> 0xFF) != ch)) {
>                           ^~~~~~~~~~~~~~~~~~
> ../iperlsys.h:305:29: note: expanded from macro 'PerlSIO_get_ptr'
> #define PerlSIO_get_ptr(f)              FILE_ptr(f)
>                                         ^~~~~~~~~~~

This code is trying to poke at glibc FILE structure internals and is
invalid. Depending on what it's trying to do there may or may not be a
valid way to achieve the same thing.

Rich


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-10-14  1:51 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-13 21:47 compiling SPECCPU2006 against Musl K Jelesnianski
2018-10-14  1:51 ` Rich Felker

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).