diff --git a/agent/src/os/linux/Makefile b/agent/src/os/linux/Makefile index e243171bc2ee3b2aa348b0f6a5e8b49a146b4872..c7b64107b14485b1fa522250d67f0176d33c85d8 100644 --- a/agent/src/os/linux/Makefile +++ b/agent/src/os/linux/Makefile @@ -60,6 +60,14 @@ ifndef LDNOMAP LFLAGS_LIBSA = -Xlinker --version-script=mapfile endif +# If this is a --hash-style=gnu system, use --hash-style=both +# The gnu .hash section won't work on some Linux systems like SuSE 10. +_HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu') +ifneq ($(_HAS_HASH_STYLE_GNU),) + LDFLAGS_HASH_STYLE = -Wl,--hash-style=both +endif +LFLAGS_LIBSA += $(LDFLAGS_HASH_STYLE) + $(LIBSA): $(OBJS) mapfile if [ ! -d $(ARCH) ] ; then mkdir $(ARCH) ; fi $(GCC) -shared $(LFLAGS_LIBSA) -o $(LIBSA) $(OBJS) $(LIBS) diff --git a/make/linux/makefiles/jsig.make b/make/linux/makefiles/jsig.make index 0d254bfe8f3c5d1a50913bff6f94cb1fa3e28642..9189fa5930fc6e82c36b2ce6be260144c1d22f59 100644 --- a/make/linux/makefiles/jsig.make +++ b/make/linux/makefiles/jsig.make @@ -39,7 +39,7 @@ LIBJSIG_MAPFILE = $(MAKEFILES_DIR)/mapfile-vers-jsig # cause problems with interposing. See CR: 6466665 # LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE)) -LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT +LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE) $(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE) @echo Making signal interposition lib... diff --git a/make/linux/makefiles/saproc.make b/make/linux/makefiles/saproc.make index 052adb134132553efae2f261c621d877634c61c3..faf677863b8375a4a2a4395df7c693eb0715a6d9 100644 --- a/make/linux/makefiles/saproc.make +++ b/make/linux/makefiles/saproc.make @@ -51,7 +51,7 @@ checkAndBuildSA: $(MAKE) -f vm.make $(LIBSAPROC); \ fi -SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE)) +SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE)) $(LDFLAGS_HASH_STYLE) $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE) $(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \ diff --git a/src/share/vm/opto/connode.cpp b/src/share/vm/opto/connode.cpp index 46f13c652b6d41f537060d1822c2301ffa83f651..9e82a8e44415f0c24ebe3f023846fdfc219a877d 100644 --- a/src/share/vm/opto/connode.cpp +++ b/src/share/vm/opto/connode.cpp @@ -128,6 +128,10 @@ Node *CMoveNode::is_cmove_id( PhaseTransform *phase, Node *cmp, Node *t, Node *f // Swapped Cmp is OK (phase->eqv(cmp->in(2),f) && phase->eqv(cmp->in(1),t)) ) { + // Give up this identity check for floating points because it may choose incorrect + // value around 0.0 and -0.0 + if ( cmp->Opcode()==Op_CmpF || cmp->Opcode()==Op_CmpD ) + return NULL; // Check for "(t==f)?t:f;" and replace with "f" if( b->_test._test == BoolTest::eq ) return f; diff --git a/src/share/vm/opto/divnode.cpp b/src/share/vm/opto/divnode.cpp index 55350e11f66a632bd05eede6685392426225bed7..a81e3b1942f755b0e85027747d519574d2d21179 100644 --- a/src/share/vm/opto/divnode.cpp +++ b/src/share/vm/opto/divnode.cpp @@ -298,8 +298,10 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con // 6732154: Construct both w1 and w2 before transforming, so t // doesn't go dead prematurely. - w1 = phase->transform(w1); + // 6837011: We need to transform w2 before w1 because the + // transformation of w1 could return t. w2 = phase->transform(w2); + w1 = phase->transform(w1); // w1 = u0*v1 + w1; Node* u0v1 = phase->transform(new (phase->C, 3) MulLNode(u0, v1)); diff --git a/test/compiler/6837011/Test6837011.java b/test/compiler/6837011/Test6837011.java new file mode 100644 index 0000000000000000000000000000000000000000..696e992d32c89c469ca0db4fbd2343bc4c2e6914 --- /dev/null +++ b/test/compiler/6837011/Test6837011.java @@ -0,0 +1,45 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6837011 + * @summary SIGSEGV in PhaseIdealLoop in 32bit jvm + * + * @run main/othervm -Xcomp -XX:CompileOnly=Test6837011.main Test6837011 + */ + +public class Test6837011 { + static boolean var_3 = true; + + public static void main(String[] args) { + double var_5; + char var_7 = 1; + double var_11 = 0; + + do { + var_11++; + var_5 = (var_7 /= ( var_3 ? ~1L : 3 ) ); + } while (var_11 < 1); + } +}