----- Original Message ----- > Hello, > > As representative for the build-infra group creating the new Hotspot > build, I appreciate that the changes are made in configure. That will at > least automatically force me to merge them correctly when they hit the > build-infra forest and will make the merge easier. The idea is to start > getting the new Hotspot build in soon after Jigsaw M3 is integrated. If > the GCC 6 changes get in soon enough in jdk9/dev I will be able to merge > and convert in time. >
When is M3 due to happen? I couldn't see anything regarding the milestones on http://openjdk.java.net/projects/jdk9/. Hopefully we can get this change in this week. > I like the refactoring of the FLAGS_COMPILER_CHECK_ARGUMENTS. Disabling > optimizations that have obviously worked fine for a long time doesn't > seem like a good idea though. I would prefer putting a conditional on > the GCC version in those cases, but still keep the proposed flag check > as well. There should be a toolchain version variable to compare > against. I agree that will lower the potential impact of this change. I've added: + TOOLCHAIN_CHECK_COMPILER_VERSION(VERSION: 6, IF_AT_LEAST: FLAGS_SETUP_GCC6_COMPILER_FLAGS) and moved the -fno-lifetime-dse and -fno-delete-null-pointer-checks into this new macro, FLAGS_SETUP_GCC6_COMPILER_FLAGS. I'll post the revised version once I've done more testing with GCC 6. With GCC 5.3, I can confirm the tests and additions are gone with this change. I would also prefer if you could break the rather long line in > hotspot-spec.gmk.in. > Done. I've also updated its copyright line as requested. > If you would like to try out the new build in its current state, feel > free to clone build-infra/jdk9. > Thanks. I'll try and take a look. > /Erik > > On 2016-03-15 05:18, Andrew Hughes wrote: > > ----- Original Message ----- > >>> On Mar 14, 2016, at 3:17 PM, Andrew Hughes <gnu.and...@redhat.com> wrote: > >>> > >>> Bug: https://bugs.openjdk.java.net/browse/JDK-8151841 > >>> Webrev: http://cr.openjdk.java.net/~andrew/8151841/webrev.01/ > >>> > >>> A number of additional flags need to be passed to the C and C++ compiler > >>> for OpenJDK to compile with GCC 6: > >> This might not be the best time to be making interesting changes to > >> the Hotspot build system in order to support a not yet released > >> compiler, since there is a new Hotspot build system coming soon: > >> https://bugs.openjdk.java.net/browse/JDK-8076052, > >> http://openjdk.java.net/jeps/284. But I'll leave that up to the folks > >> in charge of the build infrastructure. > > I'm not sure I'd refer to this as 'interesting changes'. GCC 6 is in final > > regression testing at the moment and will be appearing in the upcoming > > releases > > of a number of GNU/Linux distributions. It's pretty necessary to get this > > fix > > in now, so that it can also be fixed in 8u and get out into released > > versions > > which are being packaged for these distributions. It may not be released > > right > > now, but, by the time it's worked its way through the system, people will > > already > > be experiencing build failures with GCC 6. > > > > I briefly saw a post about these HotSpot changes when I was about to post > > this, > > and I was wondering when this was going to be finally cleaned up when I was > > working > > on the patch. It's good to see it being done. I don't think it changes the > > need > > for this patch though, as these flags also need to be added to the JDK > > build. > > At best, it will simplify the HotSpot part of this patch, which at the > > moment, > > is pretty ugly. Hopefully, this will mean that HotSpot is then actually > > using > > the C++ flags rather than the C ones! If you'd like some further testing of > > this new build, I'd be happy to take a look. > > > > My primary target for this though is 8u, so I'd like to see this in sooner > > rather > > than later. If we wait for the HotSpot build system to change, we're going > > to have > > a lot of broken 8u reports. > > > >> That said, here are some specific comments on the webrev. > >> > >> ------------------------------------------------------------------------------ > >> common/autoconf/hotspot-spec.gmk.in > >> Needs copyright update. > > It looks like it did years ago. My feelings on these are that they are best > > done in bulk in their own changeset. Including them with other changes > > makes > > it hard to then backport the patch cleanly. But I can add that if it's > > really > > necessary. > > > >> ------------------------------------------------------------------------------ > >> common/autoconf/flags.m4 > >> 631 # These flags are required for GCC 6 builds but may not be > >> available > >> on earlier versions > >> 632 NO_NULL_POINTER_CHECK_CFLAG="-fno-delete-null-pointer-checks" > >> > >> According to gcc documentation, this option goes back at least into > >> the 3.x series. So this seems somewhat overkill. > > Possibly. I've tended to err on the side of caution; the option could > > equally be > > removed or renamed in some future release. > > > >> ------------------------------------------------------------------------------ > >> common/autoconf/flags.m4 > >> 631 # These flags are required for GCC 6 builds but may not be > >> available > >> on earlier versions > >> ... > >> 636 NO_LIFETIME_DSE_CFLAG="-fno-lifetime-dse" > >> > >> This one does seem to be relatively new; I think it's introduced in > >> gcc4.9. However, there are other places where version > >> conditionalization of options is performed, such as > >> hotspot/make/linux/makefiles/gcc.make, where the addition of some > >> options is dependent on the version. Here it's done based on behavior > >> rather than simply acceptance by the compiler being used. So, for > >> example, -Wuninitialized isn't turned on until gcc4.8, because earlier > >> versions apparently report false positives. > >> > >> Of course, there's the annoying fact that there are multiple gcc.make > >> files that might need to be modified for this. But I'm not sure the > >> simple "the compiler accepts this option" is the right test here. > > Yes, there seems to be a lot of logic duplicated in various places. The > > reason we're doing this at the root level is these options are also > > being applied to the JDK build. It seems like this is also more likely > > to survive the HotSpot build refactoring this way. > > > > Do you have an idea as to what the right test might be? I tend to > > find that checking an option is accepted is better than assuming > > it's accepted because we're using version x; changes can occasionally > > be backported to older versions at a later date. I'm not sure > > if that's what you were getting at or not. As this is an optimisation > > being disabled, rather than a warning, the behaviour is not as easily > > testable. > > > > I did consider restricting the additions to GCC >= 6, but my understanding > > is that these optimisations are problematic because of some of the OpenJDK > > code itself, and it's more simple luck that they haven't caused crashes > > before. > > I'm willing to defer to someone else more familiar with the code on this > > one > > though, and we can restrict it if it's known to be safe on earlier > > versions. > > > >> ------------------------------------------------------------------------------ > >> common/autoconf/flags.m4 > >> 588 elif test "x$TOOLCHAIN_TYPE" = xgcc; then > >> 589 CXXSTD_CXXFLAG="-std=gnu++98" > >> 590 FLAGS_CXX_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [$CXXSTD_CXXFLAG > >> -Werror], > >> 591 IF_FALSE: > >> [CXXSTD_CXXFLAG=""]) > >> > >> Checking for acceptance of this option seems like overkill. > >> > > Again, possibly. I know it fails with the C compiler. configure is not > > particularly performance critical and it's better to fail early there than > > halfway through the build. > > > >> ------------------------------------------------------------------------------ > >> common/autoconf/flags.m4 > >> > >> If the new option checks weren't being made (as discussed above), the > >> changes to the checker wouldn't be needed. > > Agreed, it could be much simpler. I think the changes are generally > > beneficial > > though. > > > >> ------------------------------------------------------------------------------ > >> common/autoconf/hotspot-spec.gmk.in > >> > >> 113 EXTRA_CFLAGS=@LEGACY_EXTRA_CFLAGS@ $(CFLAGS_CCACHE) > >> $(NO_NULL_POINTER_CHECK_FLAG) $(NO_LIFETIME_DSE_CFLAG) $(CXXSTD_CXXFLAG) > >> > >> It seems strange to only include $(NO_NULL_POINTER_CHECK_FLAG) and > >> $(NO_LIFETIME_DSE_FLAG) in EXTRA_CFLAGS, but not EXTRA_CXXFLAGS. > >> > >> And it seems strange to include $(CXXSTD_CXXFLAG) in EXTRA_CFLAGS at > >> all, rather than in EXTRA_CXXFLAGS. > > It is strange, but it's because HotSpot currently completely ignores > > EXTRA_CXXFLAGS. > > I found this out the hard way :-) > > > > When we were testing this by passing --with-extra-cflags and > > --with-extra-cxxflags > > to the build, just putting the -std option in cxxflags didn't fix the > > HotSpot build. > > There's actually no way of doing it via the command-line options such that > > that the JDK C compiler doesn't get given the -std option and issue a > > warning > > as a result. > > > > hotspot/make/linux/makefiles/rules.make:CC_COMPILE = $(CC) > > $(CXXFLAGS) $(CFLAGS) > > hotspot/make/linux/makefiles/rules.make:CXX_COMPILE = $(CXX) > > $(CXXFLAGS) $(CFLAGS) > > > > EXTRA_CFLAGS are added to CFLAGS, but CXXFLAGS is only ever given -D and -I > > options. > > Essentially it's being used to mean the pre-processor, not the C++ compiler > > in the > > HotSpot build. The C compiler is hardly used at all in the HotSpot build. > > > >> ------------------------------------------------------------------------------ > >> > >>> 2. A number of optimisations in GCC 6 lead to a broken JVM. We need to > >>> add -fno-delete-null-pointer-checks and -fno-lifetime-dse to get a > >>> working JVM. > >> That's very disturbing! > >> > >> -fdelete-null-pointer-checks is the default in much earlier versions > >> than gcc6 (since 4.5?), and much longer than that at higher > >> optimization levels (since somewhere in the 3.x series?). But maybe > >> gcc6 is doing a better job of recognizing the relevant situations. Or > >> maybe there's a bug in gcc6, which is not a released version yet. > >> > >> One specific gcc6 change that could be relevant is: > >> Value range propagation now assumes that the this pointer of C++ > >> member functions is non-null. This eliminates common null pointer > >> checks but also breaks some non-conforming code-bases (such as Qt-5, > >> Chromium, KDevelop). As a temporary work-around > >> -fno-delete-null-pointer-checks can be used. Wrong code can be > >> identified by using -fsanitize=undefined. > >> > >> There's also a new warning option in gcc6 that might help find > >> places where -fdelete-null-pointer-checks is leading to problems: > >> -Wnull-dereference. > >> > >> Do you have any information as to where things are being broken by > >> this option? I think I would prefer an attempt to track down this > >> class of problem rather than hiding it via > >> -fno-delete-null-pointer-checks. > >> > >> I don't have any suggestions for why gcc6 might be having problems > >> because of -flifetime-dse, or how to find them. Do you? This seems > >> to be a relatively new option, having been introduced in gcc4.9(?), > >> and seems to have always been on by default since being introduced. > >> Again, this could be a matter of gcc6 doing a better job of > >> recognizing relevant situations, or a bug in that not-yet-released > >> version. > >> > >> > >> > > Andrew Haley (CCed) has more details on the need for these options, > > as he diagnosed the reason for the crash, with the help of the GCC > > developers. From what I understand of it, it is a case of more > > aggressive optimisations in the new GCC running into problems with > > code that doesn't strictly conform to the specification and exhibit > > undefined behaviour. The need for -flifetime-dse is covered in > > comment #47 of the bug for this [0]; "an object field [is] being > > accessed before the object is constructed, in breach of > > C++98 [class.cdtor]". > > > > I concur with you that the real solution here is to fix this > > undefined behaviour, but that's quite an involved job (as is > > converting the code to work with C++14) and one which may not be > > able to be backported when done. What I'm > > proposing here is a workaround to keep OpenJDK building in > > the mean-time. Getting a stable OpenJDK build on GCC 6 with > > these optimisations is a more involved task. > > > > We could limit disabling these options to GCC 6 and above. > > With this initial version of the patch, I've generally > > taken the safest route; although builds with earlier versions > > may not exhibit crashes, they still perform optimisations > > where the basis for these optimisations is being broken > > by some of the code in OpenJDK. > > > > [0] https://bugzilla.redhat.com/show_bug.cgi?id=1306558#c47 > > > > Thanks for the extensive feedback, > > -- Andrew :) Senior Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) PGP Key: ed25519/35964222 (hkp://keys.gnupg.net) Fingerprint = 5132 579D D154 0ED2 3E04 C5A0 CFDA 0F9B 3596 4222