use of undeclared identifier '__NR_*' error while building clang

Hi guys,

I am following this[1] tutorial to install clang. However, I have made a small change in the configure command, and I am running it with ‘–enable-optimized’ option to avoid the debug build.

I am getting the errors (given at the end) related to undeclared identifiers ‘_NR*’. Can someone please provide some input about how to tackle this issue?

On my other machine, I followed the same guide[1] (without the --enable-optimized option), and everything built successfully.

[1] http://clang.llvm.org/get_started.html

-cfe-dev

Based on your question on IRC, it sounds like there’s something wrong with your Linux headers. Make sure you have something that provides the syscall numbers in /usr/include. My workstation has them in x86_64-linux-gnu/asm/unistd_(32|64).h:

$ ack ‘__NR_fork’ /usr/include/
/usr/include/asm-generic/unistd.h
849:#define __NR_fork 1079
851:__SYSCALL(__NR_fork, sys_fork)
853:__SYSCALL(__NR_fork, sys_ni_syscall)
857:#define __NR_syscalls (__NR_fork+1)

/usr/include/x86_64-linux-gnu/asm/unistd_32.h
10:#define __NR_fork 2

/usr/include/x86_64-linux-gnu/asm/unistd_64.h
136:#define __NR_fork 57
137:__SYSCALL(__NR_fork, stub_fork)

/usr/include/x86_64-linux-gnu/bits/syscall.h
70:#define SYS_fork __NR_fork
417:#define SYS_fork __NR_fork

Hi,

Can you provide details about your system (uname -a)? It is weird that you
don't have __NR_open defined in your system headers.
As a workaround, you may drop compiler-rt repository from your checkout,
it's possible to build Clang without it.

Hi Reid,

Thanks for the reply !

Earlier the build was complaining about not having /asm in /usr/include so I created a symbolic link to it with asm-generic, after that I am encountering this issue.

I just grep’ed for ‘__NR_fork’, and I can see these numbers in the header files.

sandeep@ubuntu:/usr/include$ grep -rni __NR_fork .
./asm-generic/unistd.h:850:#define __NR_fork 1079
./asm-generic/unistd.h:852:__SYSCALL(__NR_fork, sys_fork)
./asm-generic/unistd.h:854:__SYSCALL(__NR_fork, sys_ni_syscall)
./asm-generic/unistd.h:858:#define __NR_syscalls (__NR_fork+1)
./x86_64-linux-gnu/asm/unistd_x32.h:51:#define __NR_fork (__X32_SYSCALL_BIT + 57)
./x86_64-linux-gnu/asm/unistd_64.h:61:#define __NR_fork 57
./x86_64-linux-gnu/asm/unistd_32.h:6:#define __NR_fork 2
./x86_64-linux-gnu/bits/syscall.h:70:#define SYS_fork __NR_fork
./x86_64-linux-gnu/bits/syscall.h:418:#define SYS_fork __NR_fork
./x86_64-linux-gnu/bits/syscall.h:730:#define SYS_fork __NR_fork

So these numbers are available in /usr/include. Are these not sufficient?

Thanks,
Sandeep.

Hi Alexey !

Thanks for the reply !

Below is the output of ‘uname -a’

sandeep@ubuntu:/usr/include$ uname -a
Linux ubuntu 3.13.0-29-generic #53-Ubuntu SMP Wed Jun 4 21:00:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

I recently upgraded my Linux version (to Ubuntu 14.04). Could the issue be because of that?

So to drop compiler-rt, I can just delete the whole directory and do an incremental build? The reason I’m asking this is - it takes more than a couple of hours for the build on my system. It would be great if I can avoid it. Please let me know.

Thanks and regards,
Sandeep.

Hi Reid,

Thanks for the reply !

Earlier the build was complaining about not having /asm in /usr/include so
I created a symbolic link to it with asm-generic, after that I am
encountering this issue.

I just grep'ed for '__NR_fork', and I can see these numbers in the header
files.

sandeep@ubuntu:/usr/include$ grep -rni __NR_fork .
./asm-generic/unistd.h:850:#define __NR_fork 1079
./asm-generic/unistd.h:852:__SYSCALL(__NR_fork, sys_fork)
./asm-generic/unistd.h:854:__SYSCALL(__NR_fork, sys_ni_syscall)
./asm-generic/unistd.h:858:#define __NR_syscalls (__NR_fork+1)
./x86_64-linux-gnu/asm/unistd_x32.h:51:#define __NR_fork
(__X32_SYSCALL_BIT + 57)
./x86_64-linux-gnu/asm/unistd_64.h:61:#define __NR_fork 57
./x86_64-linux-gnu/asm/unistd_32.h:6:#define __NR_fork 2
./x86_64-linux-gnu/bits/syscall.h:70:#define SYS_fork __NR_fork
./x86_64-linux-gnu/bits/syscall.h:418:#define SYS_fork __NR_fork
./x86_64-linux-gnu/bits/syscall.h:730:#define SYS_fork __NR_fork

So these numbers are available in /usr/include. Are these not sufficient?

Sanitizers use this line to get syscall numbers:
  #include <sys/syscall.h>

Hi!