google/benchmark

[BUG] Google benchmark doesn't compile on Solaris

Open

#1,499 opened on Oct 4, 2022

View on GitHub
 (0 comments) (0 reactions) (0 assignees)C++ (7,968 stars) (1,539 forks)batch import
bughelp wanted

Description

Describe the bug

benchmark doesn't compile on Solaris 11.4 (neither upstream nor the downstream copies in LLVM).

System

  • OS: Solaris 11.4
  • Compiler and version: GCC 12.1.0 and LLVM 15.0.0

To reproduce 2. cmake -DCMAKE_BUILD_TYPE=Release -DBENCHMARK_DOWNLOAD_DEPENDENCIES=on <srcdir> 4. make

/vol/llvm/src/llvm-project/benchmark/benchmark.git/src/sysinfo.cc: In function ‘std::string benchmark::{anonymous}::GetSystemName()’:
/vol/llvm/src/llvm-project/benchmark/benchmark.git/src/sysinfo.cc:446:54: note: ‘#pragma message: HOST_NAME_MAX not defined. using 64’
  446 | #pragma message("HOST_NAME_MAX not defined. using 64")
      |        
/vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc:13:11: error: ‘namespace single { }’ redeclared as different kind of entity
   13 | namespace single {
      |           ^~~~~~
In file included from /usr/gcc/12/lib/gcc/x86_64-pc-solaris2.11/12.1.0/include-fixed/math.h:391,
                 from /usr/gcc/12/include/c++/12.1.0/bits/std_abs.h:40,
                 from /usr/gcc/12/include/c++/12.1.0/cstdlib:77,
                 from /vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc:3:
/usr/include/floatingpoint.h:69:15: note: previous declaration ‘typedef float single’
   69 | typedef float single;
      |               ^~~~~~
/vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc: In function ‘void DoSetup1(const benchmark::State&)’:
/vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc:18:5: error: ‘single’ is not a class, namespace, or enumeration
   18 |   ++single::setup_call;
      |     ^~~~~~
/vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc: In function ‘void DoTeardown1(const benchmark::State&)’:
/vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc:25:5: error: ‘single’ is not a class, namespace, or enumeration
   25 |   ++single::teardown_call;
      |     ^~~~~~
In file included from /usr/gcc/12/include/c++/12.1.0/cassert:44,
                 from /vol/llvm/src/llvm-project/benchmark/benchmark.git/include/benchmark/benchmark.h:180,
                 from /vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc:9:
/vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc: In function ‘int main(int, char**)’:
/vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc:137:10: error: ‘single’ is not a class, namespace, or enumeration
  137 |   assert(single::setup_call == 4);
      |          ^~~~~~
/vol/llvm/src/llvm-project/benchmark/benchmark.git/test/benchmark_setup_teardown_test.cc:138:10: error: ‘single’ is not a class, namespace, or enumeration
  138 |   assert(single::teardown_call == 4);
      |          ^~~~~~

The llvm-project in-tree benchmark used to compile with -Wcast-qual added, which produces additional errors:

/vol/llvm/src/llvm-project/benchmark/benchmark-rorth.git/src/sysinfo.cc:658:42: error: cast from 'const char *' to 'char *' drops const qualifier [-Werror,-Wcast-qual]
  kstat_t* ksp = kstat_lookup(kc, (char*)"cpu_info", -1, (char*)"cpu_info0");
                                         ^
/vol/llvm/src/llvm-project/benchmark/benchmark-rorth.git/src/sysinfo.cc:658:65: error: cast from 'const char *' to 'char *' drops const qualifier [-Werror,-Wcast-qual]
  kstat_t* ksp = kstat_lookup(kc, (char*)"cpu_info", -1, (char*)"cpu_info0");
                                                                ^
/vol/llvm/src/llvm-project/benchmark/benchmark-rorth.git/src/sysinfo.cc:668:53: error: cast from 'const char *' to 'char *' drops const qualifier [-Werror,-Wcast-qual]
      (kstat_named_t*)kstat_data_lookup(ksp, (char*)"current_clock_Hz");
                                                    ^
3 errors generated.

Expected behavior The code should compile cleanly.

Additional context

  • Solaris needs to include <netdb.h> for MAXHOSTNAMELEN. Also, sysconf(3C) returns long.
  • Solaris <floatingpoint.h> has a conflicting single typedef. Rename the namespace to singlethreaded to avoid the conflict and reflect what's actually meant here.

I have a patch to fix these issues and mean to post a pull request once the CLA issue is sorted out (I should have one in place from golang work).

Contributor guide

[BUG] Google benchmark doesn't compile on Solaris · google/benchmark#1499 | Good First Issue