I'm happy to report that as of this evening, Clang builds PostgreSQL without any warnings, apart from a single remaining warning that also occurs when building with GCC, which is actually a bug in GNU Flex that the Flex developers don't seem to want to fix. On GCC 4.6, the warning looks like this:
In file included from gram.y:12962:0:
scan.c: In function ‘yy_try_NUL_trans’:
scan.c:16246:23: warning: unused variable ‘yyg’ [-Wunused-variable]
With Clang, however, it looks like this:
scan.c:16246:23: warning: unused variable 'yyg' [-Wunused-variable]
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
^
Note that the "^" is directly underneath the offending variable "yyg" on the terminal emulator that generated this warning.
Note also that Clang usefully gives the context of the warning, and as a result a comment is displayed that suggests that the warning is spurious.
The Clang developers finally committed a fix to remove spurious warnings that occured when building Postgres as a result of it being statically detected that there are assignments past what appears to be the end of a single element array at the end of a struct. That doesn't happen now, although only under circumstances exactly consistent with the use of a popular idiom that is seen quite a bit in the Postgres code.
In working towards removing all Clang warnings, we detected a bug; we were assigning an enum constant from one enum to a variable that was actually another type of enum, which represented a potentially dangerous misuse of an abstraction that the Postgres code uses to represent nodes. This all occurred within a nested macro. Without Clang, it probably would have taken a long time for the problem to be noticed.
Can clang build GCC by the way? And glibc?
ReplyDelete@shevy: It can build gcc.
ReplyDeleteIt cannot build glibc just yet, e.g. because of http://llvm.org/bugs/show_bug.cgi?id=8703
Is by any chance the GCC built with CLANG any faster? or output binary is smaller?
ReplyDeleteFrom your link, it appears that a fix for that has been proposed. Does anybody know if glibc compiles after that fix is applied?
ReplyDelete@Babak Farrokhi: No. GCC bootstraps itself, using an intermediary compiler, so there would be no speed difference, except possibly in building that intermediary compiler.
ReplyDelete