Merge
authorprr
Thu, 22 Mar 2018 11:34:38 -0700
changeset 49308 ab72158ccd9d
parent 49307 333d25abbb51 (current diff)
parent 49282 271ef464fb3a (diff)
child 49309 92b1cb4cd716
Merge
src/jdk.hotspot.agent/linux/native/libsaproc/test.c
src/jdk.hotspot.agent/macosx/native/libsaproc/BsdDebuggerLocal.c
src/jdk.hotspot.agent/macosx/native/libsaproc/StubDebuggerLocal.c
src/jdk.hotspot.agent/macosx/native/libsaproc/ps_proc.c
src/jdk.hotspot.agent/macosx/native/libsaproc/salibelf.c
src/jdk.hotspot.agent/macosx/native/libsaproc/test.c
src/jdk.hotspot.agent/solaris/native/libsaproc/saproc_audit.cpp
test/langtools/tools/javac/TryWithResources/TwrShareCloseCode.java
--- a/.hgtags	Thu Mar 22 11:09:50 2018 -0700
+++ b/.hgtags	Thu Mar 22 11:34:38 2018 -0700
@@ -475,3 +475,4 @@
 4f96cf952e71cb8a127334494faf28880c26181b jdk-10+45
 1fd4d6068f54561cfc67d54fc9ca84af7212c4f8 jdk-11+3
 e59941f7247d451fa7df9eaef3fce0f492f8420c jdk-11+4
+d5c43e9f08fb9a7c74aae0d48daf17f2ad2afaef jdk-11+5
--- a/make/common/MakeBase.gmk	Thu Mar 22 11:09:50 2018 -0700
+++ b/make/common/MakeBase.gmk	Thu Mar 22 11:34:38 2018 -0700
@@ -67,6 +67,7 @@
 # In GNU Make 4.0 and higher, there is a file function for writing to files.
 ifeq (4.0, $(firstword $(sort 4.0 $(MAKE_VERSION))))
   HAS_FILE_FUNCTION := true
+  CORRECT_FUNCTION_IN_RECIPE_EVALUATION := true
 endif
 
 ##############################
--- a/make/common/NativeCompilation.gmk	Thu Mar 22 11:09:50 2018 -0700
+++ b/make/common/NativeCompilation.gmk	Thu Mar 22 11:34:38 2018 -0700
@@ -827,7 +827,9 @@
           $$(shell $(RM) $$($1_TARGET))
         endif
         $$($1_DEBUGINFO_FILES): $$($1_TARGET)
-		$$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<))
+		$$(if $$(CORRECT_FUNCTION_IN_RECIPE_EVALUATION), \
+		  $$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<)) \
+		)
 		$(TOUCH) $$@
 
         $1 += $$($1_DEBUGINFO_FILES)
@@ -875,7 +877,9 @@
         $$(shell $(RM) $$($1_TARGET))
       endif
       $$($1_IMPORT_LIBRARY): $$($1_TARGET)
-		$$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<))
+		$$(if $$(CORRECT_FUNCTION_IN_RECIPE_EVALUATION), \
+		  $$(if $$(wildcard $$@), , $$(error $$@ was not created for $$<)) \
+		)
 		$(TOUCH) $$@
     endif
 
--- a/make/lib/Lib-jdk.hotspot.agent.gmk	Thu Mar 22 11:09:50 2018 -0700
+++ b/make/lib/Lib-jdk.hotspot.agent.gmk	Thu Mar 22 11:34:38 2018 -0700
@@ -29,17 +29,15 @@
 
 ################################################################################
 
-ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx windows), )
-  DISABLE_MAPFILES := true
-endif
-
 SA_TOPDIR := $(TOPDIR)/src/jdk.hotspot.agent
 
-# Defaults for most platforms
-SA_TOOLCHAIN := TOOLCHAIN_DEFAULT
-SA_NAME := saproc
-SA_SRC += $(SA_TOPDIR)/share/native/libsaproc $(SA_TOPDIR)/$(OPENJDK_TARGET_OS)/native/libsaproc
+SA_SRC += \
+    $(SA_TOPDIR)/share/native/libsaproc \
+    $(SA_TOPDIR)/$(OPENJDK_TARGET_OS)/native/libsaproc \
+    #
+
 SA_MAPFILE := $(TOPDIR)/make/mapfiles/libsaproc/mapfile-$(OPENJDK_TARGET_OS)
+
 SA_INCLUDES := \
     $(addprefix -I, $(SA_SRC)) \
     -I$(SUPPORT_OUTPUTDIR)/headers/jdk.hotspot.agent \
@@ -47,59 +45,40 @@
     #
 
 ifeq ($(OPENJDK_TARGET_OS), linux)
-  SA_CFLAGS := $(CFLAGS_JDKLIB) -D_FILE_OFFSET_BITS=64
-  ifeq ($(OPENJDK_TARGET_CPU), x86)
-    SA_LDFLAGS := -march=i586
-  endif
-
-  SA_LIBS := -lthread_db $(LIBDL)
+  SA_CFLAGS := -D_FILE_OFFSET_BITS=64
 
 else ifeq ($(OPENJDK_TARGET_OS), solaris)
-  SA_TOOLCHAIN := TOOLCHAIN_LINK_CXX
-  SA_CFLAGS := $(CFLAGS_JDKLIB)
-  SA_CXXFLAGS := $(CXXFLAGS_JDKLIB)
-  SA_LDFLAGS := -mt $(LDFLAGS_CXX_JDK)
-  SA_LIBS := -ldl -ldemangle -lthread -lproc
+  SA_LDFLAGS := -mt
 
 else ifeq ($(OPENJDK_TARGET_OS), macosx)
-  SA_EXCLUDE_FILES := BsdDebuggerLocal.c ps_proc.c salibelf.c StubDebuggerLocal.c
-  SA_CFLAGS := $(CFLAGS_JDKLIB) \
-      -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \
+  SA_CFLAGS := -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \
       -mstack-alignment=16 -fPIC
-  SA_LIBS := -framework Foundation -framework JavaNativeFoundation \
-      -framework JavaRuntimeSupport -framework Security -framework CoreFoundation
-
 else ifeq ($(OPENJDK_TARGET_OS), windows)
-  SA_NAME := sawindbg
-  COMMON_CFLAGS := -D_WINDOWS -D_DEBUG -D_CONSOLE -D_MBCS -EHsc
-  SA_CFLAGS := $(subst -DWIN32_LEAN_AND_MEAN,, $(CFLAGS_JDKLIB)) \
-      $(COMMON_CFLAGS)
-  SA_CXXFLAGS := $(subst -DWIN32_LEAN_AND_MEAN,, $(CXXFLAGS_JDKLIB)) \
-      $(COMMON_CFLAGS)
-  SA_LDFLAGS := -manifest
-  SA_LIBS := dbgeng.lib
+  SA_CFLAGS := -D_WINDOWS -D_DEBUG -D_CONSOLE -D_MBCS -EHsc
   ifeq ($(OPENJDK_TARGET_CPU), x86_64)
-    SA_CXXFLAGS += -DWIN64
+    SA_CXXFLAGS := -DWIN64
   else
-    SA_CXXFLAGS += -RTC1
+    SA_CXXFLAGS := -RTC1
   endif
 endif
 
 ################################################################################
 
 $(eval $(call SetupJdkLibrary, BUILD_LIBSA, \
-    NAME := $(SA_NAME), \
-    TOOLCHAIN := $(SA_TOOLCHAIN), \
+    NAME := saproc, \
     OPTIMIZATION := NONE, \
     DISABLED_WARNINGS_microsoft := 4267, \
     DISABLED_WARNINGS_gcc := sign-compare, \
     DISABLED_WARNINGS_CXX_solstudio := truncwarn unknownpragma, \
     SRC := $(SA_SRC), \
-    EXCLUDE_FILES := test.c saproc_audit.cpp $(SA_EXCLUDE_FILES), \
-    CFLAGS := $(SA_INCLUDES) $(SA_CFLAGS) $(SA_CUSTOM_CFLAGS), \
-    CXXFLAGS := $(SA_INCLUDES) $(SA_CXXFLAGS) $(SA_CUSTOM_CXXFLAGS), \
+    CFLAGS := $(CFLAGS_JDKLIB) $(SA_INCLUDES) $(SA_CFLAGS) $(SA_CUSTOM_CFLAGS), \
+    CXXFLAGS := $(CXXFLAGS_JDKLIB) $(SA_INCLUDES) $(SA_CFLAGS) $(SA_CXXFLAGS), \
     LDFLAGS := $(LDFLAGS_JDKLIB) $(SA_LDFLAGS), \
-    LIBS := $(SA_LIBS), \
+    LIBS_linux := -lthread_db $(LIBDL), \
+    LIBS_solaris := -ldl -ldemangle -lthread -lproc, \
+    LIBS_macosx := -framework Foundation -framework JavaNativeFoundation \
+        -framework JavaRuntimeSupport -framework Security -framework CoreFoundation, \
+    LIBS_windows := dbgeng.lib, \
     MAPFILE := $(SA_MAPFILE), \
 ))
 
--- a/make/mapfiles/libunpack/mapfile-vers-unpack200-solaris-x86	Thu Mar 22 11:09:50 2018 -0700
+++ b/make/mapfiles/libunpack/mapfile-vers-unpack200-solaris-x86	Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2018, Oracle and/or its affiliates. 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
@@ -28,6 +28,7 @@
 SUNWprivate_1.1 {
 	global:
 		# These are needed by the c runtime in SS12u4
+		environ;
 		_environ;
 		__environ_lock;
 		___Argv;
--- a/src/java.base/share/classes/java/lang/reflect/Constructor.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/Constructor.java	Thu Mar 22 11:34:38 2018 -0700
@@ -253,6 +253,11 @@
         return parameterTypes;
     }
 
+    @Override
+    Class<?>[] getSharedExceptionTypes() {
+        return exceptionTypes;
+    }
+
     /**
      * {@inheritDoc}
      */
--- a/src/java.base/share/classes/java/lang/reflect/Executable.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/Executable.java	Thu Mar 22 11:34:38 2018 -0700
@@ -226,6 +226,10 @@
     // to the untrusted code...
     abstract Class<?>[] getSharedParameterTypes();
 
+    // returns shared array of exception types - must never give it out
+    // to the untrusted code...
+    abstract Class<?>[] getSharedExceptionTypes();
+
     /**
      * Returns an array of {@code Class} objects that represent the formal
      * parameter types, in declaration order, of the executable
--- a/src/java.base/share/classes/java/lang/reflect/Method.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/Method.java	Thu Mar 22 11:34:38 2018 -0700
@@ -301,6 +301,11 @@
         return parameterTypes;
     }
 
+    @Override
+    Class<?>[] getSharedExceptionTypes() {
+        return exceptionTypes;
+    }
+
     /**
      * {@inheritDoc}
      */
--- a/src/java.base/share/classes/java/lang/reflect/Proxy.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/Proxy.java	Thu Mar 22 11:34:38 2018 -0700
@@ -708,24 +708,32 @@
          */
         private static Set<Class<?>> referencedTypes(ClassLoader loader,
                                                      List<Class<?>> interfaces) {
-            return interfaces.stream()
-                 .flatMap(intf -> Stream.of(intf.getMethods())
-                                        .filter(m -> !Modifier.isStatic(m.getModifiers()))
-                                        .flatMap(ProxyBuilder::methodRefTypes)
-                                        .map(ProxyBuilder::getElementType)
-                                        .filter(t -> !t.isPrimitive()))
-                 .collect(Collectors.toSet());
+            var types = new HashSet<Class<?>>();
+            for (var intf : interfaces) {
+                for (Method m : intf.getMethods()) {
+                    if (!Modifier.isStatic(m.getModifiers())) {
+                        addElementType(types, m.getReturnType());
+                        addElementTypes(types, m.getSharedParameterTypes());
+                        addElementTypes(types, m.getSharedExceptionTypes());
+                    }
+                }
+            }
+            return types;
         }
 
-        /*
-         * Extracts all types referenced on a method signature including
-         * its return type, parameter types, and exception types.
-         */
-        private static Stream<Class<?>> methodRefTypes(Method m) {
-            return Stream.of(new Class<?>[] { m.getReturnType() },
-                             m.getParameterTypes(),
-                             m.getExceptionTypes())
-                         .flatMap(Stream::of);
+        private static void addElementTypes(HashSet<Class<?>> types,
+                                            Class<?> ... classes) {
+            for (var cls : classes) {
+                addElementType(types, cls);
+            }
+        }
+
+        private static void addElementType(HashSet<Class<?>> types,
+                                           Class<?> cls) {
+            var type = getElementType(cls);
+            if (!type.isPrimitive()) {
+                types.add(type);
+            }
         }
 
         /**
--- a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1726,7 +1726,7 @@
          * This map is used to look up the index of an existing entry for
          * values of all types.
          */
-        private Map<Object,Short> map = new HashMap<>(16);
+        private Map<Object,Integer> map = new HashMap<>(16);
 
         /** true if no new constant pool entries may be added */
         private boolean readOnly = false;
@@ -1878,7 +1878,7 @@
          *      java.lang.Double        CONSTANT_DOUBLE
          */
         private short getValue(Object key) {
-            Short index = map.get(key);
+            Integer index = map.get(key);
             if (index != null) {
                 return index.shortValue();
             } else {
@@ -1887,7 +1887,7 @@
                         "late constant pool addition: " + key);
                 }
                 short i = addEntry(new ValueEntry(key));
-                map.put(key, i);
+                map.put(key, (int)i);
                 return i;
             }
         }
@@ -1897,7 +1897,7 @@
          * references to other constant pool entries.
          */
         private short getIndirect(IndirectEntry e) {
-            Short index = map.get(e);
+            Integer index = map.get(e);
             if (index != null) {
                 return index.shortValue();
             } else {
@@ -1905,7 +1905,7 @@
                     throw new InternalError("late constant pool addition");
                 }
                 short i = addEntry(e);
-                map.put(e, i);
+                map.put(e, (int)i);
                 return i;
             }
         }
--- a/src/java.base/share/classes/java/nio/StringCharBuffer.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/nio/StringCharBuffer.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. 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
@@ -149,7 +149,7 @@
                                         that, that.position(),
                                         Math.min(this.remaining(), that.remaining()));
         if (i >= 0) {
-            return Character.compare(this.get(this.position() + i), that.get(this.position() + i));
+            return Character.compare(this.get(this.position() + i), that.get(that.position() + i));
         }
         return this.remaining() - that.remaining();
     }
--- a/src/java.base/share/classes/java/nio/X-Buffer.java.template	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/nio/X-Buffer.java.template	Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. 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
@@ -1337,7 +1337,7 @@
                                         that, that.position(),
                                         Math.min(this.remaining(), that.remaining()));
         if (i >= 0) {
-            return compare(this.get(this.position() + i), that.get(this.position() + i));
+            return compare(this.get(this.position() + i), that.get(that.position() + i));
         }
         return this.remaining() - that.remaining();
     }
--- a/src/java.base/share/classes/java/util/Formatter.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/share/classes/java/util/Formatter.java	Thu Mar 22 11:34:38 2018 -0700
@@ -47,6 +47,7 @@
 import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
 import java.text.NumberFormat;
+import java.text.spi.NumberFormatProvider;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.Objects;
@@ -62,6 +63,8 @@
 
 import jdk.internal.math.DoubleConsts;
 import jdk.internal.math.FormattedFloatingDecimal;
+import sun.util.locale.provider.LocaleProviderAdapter;
+import sun.util.locale.provider.ResourceBundleBasedAdapter;
 
 /**
  * An interpreter for printf-style format strings.  This class provides support
@@ -4476,8 +4479,33 @@
                 } else {
                     DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(l);
                     grpSep = dfs.getGroupingSeparator();
-                    DecimalFormat df = (DecimalFormat) NumberFormat.getIntegerInstance(l);
+                    DecimalFormat df = null;
+                    NumberFormat nf = NumberFormat.getNumberInstance(l);
+                    if (nf instanceof DecimalFormat) {
+                        df = (DecimalFormat) nf;
+                    } else {
+
+                        // Use DecimalFormat constructor to obtain the instance,
+                        // in case NumberFormat.getNumberInstance(l)
+                        // returns instance other than DecimalFormat
+                        LocaleProviderAdapter adapter = LocaleProviderAdapter
+                                .getAdapter(NumberFormatProvider.class, l);
+                        if (!(adapter instanceof ResourceBundleBasedAdapter)) {
+                            adapter = LocaleProviderAdapter.getResourceBundleBased();
+                        }
+                        String[] all = adapter.getLocaleResources(l)
+                                .getNumberPatterns();
+                        df = new DecimalFormat(all[0], dfs);
+                    }
                     grpSize = df.getGroupingSize();
+                    // Some locales do not use grouping (the number
+                    // pattern for these locales does not contain group, e.g.
+                    // ("#0.###")), but specify a grouping separator.
+                    // To avoid unnecessary identification of the position of
+                    // grouping separator, reset its value with null character
+                    if (!df.isGroupingUsed() || grpSize == 0) {
+                        grpSep = '\0';
+                    }
                 }
             }
 
--- a/src/java.base/windows/classes/java/io/WinNTFileSystem.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.base/windows/classes/java/io/WinNTFileSystem.java	Thu Mar 22 11:34:38 2018 -0700
@@ -50,7 +50,7 @@
         slash = props.getProperty("file.separator").charAt(0);
         semicolon = props.getProperty("path.separator").charAt(0);
         altSlash = (this.slash == '\\') ? '/' : '\\';
-        userDir = props.getProperty("user.dir");
+        userDir = normalize(props.getProperty("user.dir"));
     }
 
     private boolean isSlash(char c) {
--- a/src/java.instrument/share/native/libinstrument/Reentrancy.c	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.instrument/share/native/libinstrument/Reentrancy.c	Thu Mar 22 11:34:38 2018 -0700
@@ -90,7 +90,7 @@
                 jthread         thread,
                 const void *    expected) {
     jvmtiError  error;
-    void *      test = (void *) 0x99999999;
+    void *      test = (void *) 0x99999999UL;
 
     /* now check if we do a fetch we get what we wrote */
     error = (*jvmtienv)->GetThreadLocalStorage(
--- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1,42 +1,28 @@
 /*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
  * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
- * The contents of this file are subject to the terms of either the GNU
- * General Public License Version 2 only ("GPL") or the Common Development
- * and Distribution License("CDDL") (collectively, the "License").  You
- * may not use this file except in compliance with the License.  You can
- * obtain a copy of the License at
- * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
- * or packager/legal/LICENSE.txt.  See the License for the specific
- * language governing permissions and limitations under the License.
- *
- * When distributing the software, include this License Header Notice in each
- * file and include the License file at packager/legal/LICENSE.txt.
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
  *
- * GPL Classpath Exception:
- * Oracle designates this particular file as subject to the "Classpath"
- * exception as provided by Oracle in the GPL Version 2 section of the License
- * file that accompanied this code.
- *
- * Modifications:
- * If applicable, add the following below the License Header, with the fields
- * enclosed by brackets [] replaced by your own identifying information:
- * "Portions Copyright [year] [name of copyright owner]"
+ * 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).
  *
- * Contributor(s):
- * If you wish your version of this file to be governed by only the CDDL or
- * only the GPL Version 2, indicate your decision by adding "[Contributor]
- * elects to include this software in this distribution under the [CDDL or GPL
- * Version 2] license."  If you don't indicate a single choice of license, a
- * recipient has the option to distribute your version of this file under
- * either the CDDL, the GPL Version 2 or to extend the choice of license to
- * its licensees as provided above.  However, if you add GPL Version 2 code
- * and therefore, elected the GPL Version 2 license, then the option applies
- * only if the new code is made subject to such option by the copyright
- * holder.
+ * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
  */
+
 package com.sun.org.apache.xerces.internal.utils;
 
 import com.sun.org.apache.xerces.internal.impl.Constants;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java	Thu Mar 22 11:34:38 2018 -0700
@@ -216,6 +216,7 @@
                     } catch (RuntimeException ex) {
                         throw new PropagatedException(ex);
                     }
+                    break;
                 }
             }
         }
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java	Thu Mar 22 11:34:38 2018 -0700
@@ -313,6 +313,12 @@
      */
     public static final long ANONCONSTR_BASED = 1L<<57;
 
+    /**
+     * Flag that marks finalize block as body-only, should not be copied into catch clauses.
+     * Used to implement try-with-resources.
+     */
+    public static final long BODY_ONLY_FINALIZE = 1L<<17; //blocks only
+
     /** Modifier masks.
      */
     public static final int
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1519,26 +1519,22 @@
      *
      * {
      *   final VariableModifiers_minus_final R #resource = Expression;
-     *   Throwable #primaryException = null;
      *
      *   try ResourceSpecificationtail
      *     Block
-     *   catch (Throwable #t) {
-     *     #primaryException = t;
-     *     throw #t;
-     *   } finally {
-     *     if (#resource != null) {
-     *       if (#primaryException != null) {
-     *         try {
-     *           #resource.close();
-     *         } catch(Throwable #suppressedException) {
-     *           #primaryException.addSuppressed(#suppressedException);
-     *         }
-     *       } else {
+     *   } body-only-finally {
+     *     if (#resource != null) //nullcheck skipped if Expression is provably non-null
      *         #resource.close();
-     *       }
-     *     }
+     *   } catch (Throwable #primaryException) {
+     *       if (#resource != null) //nullcheck skipped if Expression is provably non-null
+     *           try {
+     *               #resource.close();
+     *           } catch (Throwable #suppressedException) {
+     *              #primaryException.addSuppressed(#suppressedException);
+     *           }
+     *       throw #primaryException;
      *   }
+     * }
      *
      * @param tree  The try statement to inspect.
      * @return A a desugared try-with-resources tree, or the original
@@ -1547,8 +1543,7 @@
     JCTree makeTwrTry(JCTry tree) {
         make_at(tree.pos());
         twrVars = twrVars.dup();
-        JCBlock twrBlock = makeTwrBlock(tree.resources, tree.body,
-                tree.finallyCanCompleteNormally, 0);
+        JCBlock twrBlock = makeTwrBlock(tree.resources, tree.body, 0);
         if (tree.catchers.isEmpty() && tree.finalizer == null)
             result = translate(twrBlock);
         else
@@ -1557,19 +1552,18 @@
         return result;
     }
 
-    private JCBlock makeTwrBlock(List<JCTree> resources, JCBlock block,
-            boolean finallyCanCompleteNormally, int depth) {
+    private JCBlock makeTwrBlock(List<JCTree> resources, JCBlock block, int depth) {
         if (resources.isEmpty())
             return block;
 
         // Add resource declaration or expression to block statements
         ListBuffer<JCStatement> stats = new ListBuffer<>();
         JCTree resource = resources.head;
-        JCExpression expr = null;
+        JCExpression resourceUse;
         boolean resourceNonNull;
         if (resource instanceof JCVariableDecl) {
             JCVariableDecl var = (JCVariableDecl) resource;
-            expr = make.Ident(var.sym).setType(resource.type);
+            resourceUse = make.Ident(var.sym).setType(resource.type);
             resourceNonNull = var.init != null && TreeInfo.skipParens(var.init).hasTag(NEWCLASS);
             stats.add(var);
         } else {
@@ -1584,164 +1578,82 @@
             twrVars.enter(syntheticTwrVar);
             JCVariableDecl syntheticTwrVarDecl =
                 make.VarDef(syntheticTwrVar, (JCExpression)resource);
-            expr = (JCExpression)make.Ident(syntheticTwrVar);
-            resourceNonNull = TreeInfo.skipParens(resource).hasTag(NEWCLASS);
+            resourceUse = (JCExpression)make.Ident(syntheticTwrVar);
+            resourceNonNull = false;
             stats.add(syntheticTwrVarDecl);
         }
 
-        // Add primaryException declaration
+        //create (semi-) finally block that will be copied into the main try body:
+        int oldPos = make.pos;
+        make.at(TreeInfo.endPos(block));
+
+        // if (#resource != null) { #resource.close(); }
+        JCStatement bodyCloseStatement = makeResourceCloseInvocation(resourceUse);
+
+        if (!resourceNonNull) {
+            bodyCloseStatement = make.If(makeNonNullCheck(resourceUse),
+                                         bodyCloseStatement,
+                                         null);
+        }
+
+        JCBlock finallyClause = make.Block(BODY_ONLY_FINALIZE, List.of(bodyCloseStatement));
+        make.at(oldPos);
+
+        // Create catch clause that saves exception, closes the resource and then rethrows the exception:
         VarSymbol primaryException =
-            new VarSymbol(SYNTHETIC,
-                          makeSyntheticName(names.fromString("primaryException" +
-                          depth), twrVars),
-                          syms.throwableType,
-                          currentMethodSym);
-        twrVars.enter(primaryException);
-        JCVariableDecl primaryExceptionTreeDecl = make.VarDef(primaryException, makeNull());
-        stats.add(primaryExceptionTreeDecl);
-
-        // Create catch clause that saves exception and then rethrows it
-        VarSymbol param =
             new VarSymbol(FINAL|SYNTHETIC,
                           names.fromString("t" +
                                            target.syntheticNameChar()),
                           syms.throwableType,
                           currentMethodSym);
-        JCVariableDecl paramTree = make.VarDef(param, null);
-        JCStatement assign = make.Assignment(primaryException, make.Ident(param));
-        JCStatement rethrowStat = make.Throw(make.Ident(param));
-        JCBlock catchBlock = make.Block(0L, List.of(assign, rethrowStat));
-        JCCatch catchClause = make.Catch(paramTree, catchBlock);
-
-        int oldPos = make.pos;
-        make.at(TreeInfo.endPos(block));
-        JCBlock finallyClause = makeTwrFinallyClause(primaryException, expr, resourceNonNull);
-        make.at(oldPos);
-        JCTry outerTry = make.Try(makeTwrBlock(resources.tail, block,
-                                    finallyCanCompleteNormally, depth + 1),
-                                  List.of(catchClause),
-                                  finallyClause);
-        outerTry.finallyCanCompleteNormally = finallyCanCompleteNormally;
-        stats.add(outerTry);
-        JCBlock newBlock = make.Block(0L, stats.toList());
-        return newBlock;
-    }
-
-    /**If the estimated number of copies the close resource code in a single class is above this
-     * threshold, generate and use a method for the close resource code, leading to smaller code.
-     * As generating a method has overhead on its own, generating the method for cases below the
-     * threshold could lead to an increase in code size.
-     */
-    public static final int USE_CLOSE_RESOURCE_METHOD_THRESHOLD = 4;
-
-    private JCBlock makeTwrFinallyClause(Symbol primaryException, JCExpression resource,
-            boolean resourceNonNull) {
-        MethodSymbol closeResource = (MethodSymbol)lookupSynthetic(dollarCloseResource,
-                                                                   currentClass.members());
-
-        if (closeResource == null && shouldUseCloseResourceMethod()) {
-            closeResource = new MethodSymbol(
-                PRIVATE | STATIC | SYNTHETIC,
-                dollarCloseResource,
-                new MethodType(
-                    List.of(syms.throwableType, syms.autoCloseableType),
-                    syms.voidType,
-                    List.nil(),
-                    syms.methodClass),
-                currentClass);
-            enterSynthetic(resource.pos(), closeResource, currentClass.members());
-
-            JCMethodDecl md = make.MethodDef(closeResource, null);
-            List<JCVariableDecl> params = md.getParameters();
-            md.body = make.Block(0, List.of(makeTwrCloseStatement(params.get(0).sym,
-                                                                               make.Ident(params.get(1)))));
-
-            JCClassDecl currentClassDecl = classDef(currentClass);
-            currentClassDecl.defs = currentClassDecl.defs.prepend(md);
-        }
-
-        JCStatement closeStatement;
-
-        if (closeResource != null) {
-            //$closeResource(#primaryException, #resource)
-            closeStatement = make.Exec(make.Apply(List.nil(),
-                                                  make.Ident(closeResource),
-                                                  List.of(make.Ident(primaryException),
-                                                          resource)
-                                                 ).setType(syms.voidType));
-        } else {
-            closeStatement = makeTwrCloseStatement(primaryException, resource);
-        }
-
-        JCStatement finallyStatement;
-
-        if (resourceNonNull) {
-            finallyStatement = closeStatement;
-        } else {
-            // if (#resource != null) { $closeResource(...); }
-            finallyStatement = make.If(makeNonNullCheck(resource),
-                                       closeStatement,
-                                       null);
-        }
-
-        return make.Block(0L,
-                          List.of(finallyStatement));
-    }
-        //where:
-        private boolean shouldUseCloseResourceMethod() {
-            class TryFinder extends TreeScanner {
-                int closeCount;
-                @Override
-                public void visitTry(JCTry tree) {
-                    boolean empty = tree.body.stats.isEmpty();
-
-                    for (JCTree r : tree.resources) {
-                        closeCount += empty ? 1 : 2;
-                        empty = false; //with multiple resources, only the innermost try can be empty.
-                    }
-                    super.visitTry(tree);
-                }
-                @Override
-                public void scan(JCTree tree) {
-                    if (useCloseResourceMethod())
-                        return;
-                    super.scan(tree);
-                }
-                boolean useCloseResourceMethod() {
-                    return closeCount >= USE_CLOSE_RESOURCE_METHOD_THRESHOLD;
-                }
-            }
-            TryFinder tryFinder = new TryFinder();
-            tryFinder.scan(classDef(currentClass));
-            return tryFinder.useCloseResourceMethod();
-        }
-
-    private JCStatement makeTwrCloseStatement(Symbol primaryException, JCExpression resource) {
-        // primaryException.addSuppressed(catchException);
-        VarSymbol catchException =
+        JCVariableDecl primaryExceptionDecl = make.VarDef(primaryException, null);
+
+        // close resource:
+        // try {
+        //     #resource.close();
+        // } catch (Throwable #suppressedException) {
+        //     #primaryException.addSuppressed(#suppressedException);
+        // }
+        VarSymbol suppressedException =
             new VarSymbol(SYNTHETIC, make.paramName(2),
                           syms.throwableType,
                           currentMethodSym);
-        JCStatement addSuppressionStatement =
+        JCStatement addSuppressedStatement =
             make.Exec(makeCall(make.Ident(primaryException),
                                names.addSuppressed,
-                               List.of(make.Ident(catchException))));
-
-        // try { resource.close(); } catch (e) { primaryException.addSuppressed(e); }
-        JCBlock tryBlock =
-            make.Block(0L, List.of(makeResourceCloseInvocation(resource)));
-        JCVariableDecl catchExceptionDecl = make.VarDef(catchException, null);
-        JCBlock catchBlock = make.Block(0L, List.of(addSuppressionStatement));
-        List<JCCatch> catchClauses = List.of(make.Catch(catchExceptionDecl, catchBlock));
-        JCTry tryTree = make.Try(tryBlock, catchClauses, null);
-        tryTree.finallyCanCompleteNormally = true;
-
-        // if (primaryException != null) {try...} else resourceClose;
-        JCIf closeIfStatement = make.If(makeNonNullCheck(make.Ident(primaryException)),
-                                        tryTree,
-                                        makeResourceCloseInvocation(resource));
-
-        return closeIfStatement;
+                               List.of(make.Ident(suppressedException))));
+        JCBlock closeResourceTryBlock =
+            make.Block(0L, List.of(makeResourceCloseInvocation(resourceUse)));
+        JCVariableDecl catchSuppressedDecl = make.VarDef(suppressedException, null);
+        JCBlock catchSuppressedBlock = make.Block(0L, List.of(addSuppressedStatement));
+        List<JCCatch> catchSuppressedClauses =
+                List.of(make.Catch(catchSuppressedDecl, catchSuppressedBlock));
+        JCTry closeResourceTry = make.Try(closeResourceTryBlock, catchSuppressedClauses, null);
+        closeResourceTry.finallyCanCompleteNormally = true;
+
+        JCStatement exceptionalCloseStatement = closeResourceTry;
+
+        if (!resourceNonNull) {
+            // if (#resource != null) {  }
+            exceptionalCloseStatement = make.If(makeNonNullCheck(resourceUse),
+                                                exceptionalCloseStatement,
+                                                null);
+        }
+
+        JCStatement exceptionalRethrow = make.Throw(make.Ident(primaryException));
+        JCBlock exceptionalCloseBlock = make.Block(0L, List.of(exceptionalCloseStatement, exceptionalRethrow));
+        JCCatch exceptionalCatchClause = make.Catch(primaryExceptionDecl, exceptionalCloseBlock);
+
+        //create the main try statement with the close:
+        JCTry outerTry = make.Try(makeTwrBlock(resources.tail, block, depth + 1),
+                                  List.of(exceptionalCatchClause),
+                                  finallyClause);
+
+        outerTry.finallyCanCompleteNormally = true;
+        stats.add(outerTry);
+
+        JCBlock newBlock = make.Block(0L, stats.toList());
+        return newBlock;
     }
 
     private JCStatement makeResourceCloseInvocation(JCExpression resource) {
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1342,6 +1342,16 @@
             boolean hasFinalizer() {
                 return tree.finalizer != null;
             }
+
+            @Override
+            void afterBody() {
+                if (tree.finalizer != null && (tree.finalizer.flags & BODY_ONLY_FINALIZE) != 0) {
+                    //for body-only finally, remove the GenFinalizer after try body
+                    //so that the finally is not generated to catch bodies:
+                    tryEnv.info.finalize = null;
+                }
+            }
+
         };
         tryEnv.info.gaps = new ListBuffer<>();
         genTry(tree.body, tree.catchers, tryEnv);
@@ -1358,15 +1368,16 @@
             Code.State stateTry = code.state.dup();
             genStat(body, env, CRT_BLOCK);
             int endpc = code.curCP();
-            boolean hasFinalizer =
-                env.info.finalize != null &&
-                env.info.finalize.hasFinalizer();
             List<Integer> gaps = env.info.gaps.toList();
             code.statBegin(TreeInfo.endPos(body));
             genFinalizer(env);
             code.statBegin(TreeInfo.endPos(env.tree));
             Chain exitChain = code.branch(goto_);
             endFinalizerGap(env);
+            env.info.finalize.afterBody();
+            boolean hasFinalizer =
+                env.info.finalize != null &&
+                env.info.finalize.hasFinalizer();
             if (startpc != endpc) for (List<JCCatch> l = catchers; l.nonEmpty(); l = l.tail) {
                 // start off with exception on stack
                 code.entryPoint(stateTry, l.head.param.sym.type);
@@ -2219,6 +2230,9 @@
 
         /** Does this finalizer have some nontrivial cleanup to perform? */
         boolean hasFinalizer() { return true; }
+
+        /** Should be invoked after the try's body has been visited. */
+        void afterBody() {}
     }
 
     /** code generation contexts,
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java	Thu Mar 22 11:34:38 2018 -0700
@@ -836,9 +836,7 @@
 
         String checkPackages = options.get(Option.XDOCLINT_PACKAGE);
         if (checkPackages != null) {
-            for (String s : checkPackages.split("\\s+")) {
-                doclintOpts.add(DocLint.XCHECK_PACKAGE + s);
-            }
+            doclintOpts.add(DocLint.XCHECK_PACKAGE + checkPackages);
         }
 
         String format = options.get(Option.DOCLINT_FORMAT);
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java	Thu Mar 22 11:34:38 2018 -0700
@@ -134,9 +134,9 @@
         }
 
         @Override
-        public void process(OptionHelper helper, String option) {
+        public void process(OptionHelper helper, String option, String arg) {
             String prev = helper.get(XDOCLINT_CUSTOM);
-            String next = (prev == null) ? option : (prev + " " + option);
+            String next = (prev == null) ? arg : (prev + " " + arg);
             helper.put(XDOCLINT_CUSTOM.primaryName, next);
         }
     },
@@ -149,9 +149,9 @@
         }
 
         @Override
-        public void process(OptionHelper helper, String option) {
+        public void process(OptionHelper helper, String option, String arg) {
             String prev = helper.get(XDOCLINT_PACKAGE);
-            String next = (prev == null) ? option : (prev + " " + option);
+            String next = (prev == null) ? arg : (prev + "," + arg);
             helper.put(XDOCLINT_PACKAGE.primaryName, next);
         }
     },
@@ -512,8 +512,7 @@
 
     PLUGIN("-Xplugin:", "opt.arg.plugin", "opt.plugin", EXTENDED, BASIC) {
         @Override
-        public void process(OptionHelper helper, String option) {
-            String p = option.substring(option.indexOf(':') + 1).trim();
+        public void process(OptionHelper helper, String option, String p) {
             String prev = helper.get(PLUGIN);
             helper.put(PLUGIN.primaryName, (prev == null) ? p : prev + '\0' + p);
         }
--- a/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h	Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. 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
@@ -30,10 +30,6 @@
 #include <stdint.h>
 #include "proc_service.h"
 
-#ifdef ALT_SASRCDIR
-#include "libproc_md.h"
-#endif
-
 #include <sys/ptrace.h>
 
 /************************************************************************************
--- a/src/jdk.hotspot.agent/linux/native/libsaproc/test.c	Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2003, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "libproc.h"
-
-int main(int argc, char** argv) {
-   struct ps_prochandle* ph;
-
-   init_libproc(true);
-   switch (argc) {
-      case 2: {
-         // process
-         ph = Pgrab(atoi(argv[1]));
-         break;
-      }
-
-      case 3: {
-        // core
-        ph = Pgrab_core(argv[1], argv[2]);
-        break;
-      }
-
-      default: {
-        printf("usage %s <pid> or %s <exec file> <core file>\n");
-        return 1;
-      }
-   }
-
-   if (ph) {
-      Prelease(ph);
-      return 0;
-   } else {
-      printf("can't connect to debuggee\n");
-      return 1;
-   }
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/BsdDebuggerLocal.c	Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,402 +0,0 @@
-/*
- * Copyright (c) 2002, 2017, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdlib.h>
-#include <jni.h>
-#include "libproc.h"
-
-#if defined(x86_64) && !defined(amd64)
-#define amd64 1
-#endif
-
-#ifdef i386
-#include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
-#endif
-
-#ifdef amd64
-#include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
-#endif
-
-#if defined(sparc) || defined(sparcv9)
-#include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h"
-#endif
-
-static jfieldID p_ps_prochandle_ID = 0;
-static jfieldID threadList_ID = 0;
-static jfieldID loadObjectList_ID = 0;
-
-static jmethodID createClosestSymbol_ID = 0;
-static jmethodID createLoadObject_ID = 0;
-static jmethodID getThreadForThreadId_ID = 0;
-static jmethodID listAdd_ID = 0;
-
-#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
-#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
-#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
-#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
-
-static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
-  (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
-}
-
-static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
-  jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);
-  return (struct ps_prochandle*)(intptr_t)ptr;
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    init0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0
-  (JNIEnv *env, jclass cls) {
-  jclass listClass;
-
-  if (init_libproc(getenv("LIBSAPROC_DEBUG") != NULL) != true) {
-     THROW_NEW_DEBUGGER_EXCEPTION("can't initialize libproc");
-  }
-
-  // fields we use
-  p_ps_prochandle_ID = (*env)->GetFieldID(env, cls, "p_ps_prochandle", "J");
-  CHECK_EXCEPTION;
-  threadList_ID = (*env)->GetFieldID(env, cls, "threadList", "Ljava/util/List;");
-  CHECK_EXCEPTION;
-  loadObjectList_ID = (*env)->GetFieldID(env, cls, "loadObjectList", "Ljava/util/List;");
-  CHECK_EXCEPTION;
-
-  // methods we use
-  createClosestSymbol_ID = (*env)->GetMethodID(env, cls, "createClosestSymbol",
-                    "(Ljava/lang/String;J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;");
-  CHECK_EXCEPTION;
-  createLoadObject_ID = (*env)->GetMethodID(env, cls, "createLoadObject",
-                    "(Ljava/lang/String;JJ)Lsun/jvm/hotspot/debugger/cdbg/LoadObject;");
-  CHECK_EXCEPTION;
-  getThreadForThreadId_ID = (*env)->GetMethodID(env, cls, "getThreadForThreadId",
-                                                     "(J)Lsun/jvm/hotspot/debugger/ThreadProxy;");
-  CHECK_EXCEPTION;
-  // java.util.List method we call
-  listClass = (*env)->FindClass(env, "java/util/List");
-  CHECK_EXCEPTION;
-  listAdd_ID = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z");
-  CHECK_EXCEPTION;
-}
-
-JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize
-  (JNIEnv *env, jclass cls)
-{
-#ifdef _LP64
- return 8;
-#else
- return 4;
-#endif
-
-}
-
-
-static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) {
-  int n = 0, i = 0;
-
-  // add threads
-  n = get_num_threads(ph);
-  for (i = 0; i < n; i++) {
-    jobject thread;
-    jobject threadList;
-    lwpid_t lwpid;
-
-    lwpid = get_lwp_id(ph, i);
-    thread = (*env)->CallObjectMethod(env, this_obj, getThreadForThreadId_ID,
-                                      (jlong)lwpid);
-    CHECK_EXCEPTION;
-    threadList = (*env)->GetObjectField(env, this_obj, threadList_ID);
-    CHECK_EXCEPTION;
-    (*env)->CallBooleanMethod(env, threadList, listAdd_ID, thread);
-    CHECK_EXCEPTION;
-  }
-
-  // add load objects
-  n = get_num_libs(ph);
-  for (i = 0; i < n; i++) {
-     uintptr_t base;
-     const char* name;
-     jobject loadObject;
-     jobject loadObjectList;
-
-     base = get_lib_base(ph, i);
-     name = get_lib_name(ph, i);
-     loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID,
-                                   (*env)->NewStringUTF(env, name), (jlong)0, (jlong)base);
-     CHECK_EXCEPTION;
-     loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID);
-     CHECK_EXCEPTION;
-     (*env)->CallBooleanMethod(env, loadObjectList, listAdd_ID, loadObject);
-     CHECK_EXCEPTION;
-  }
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    attach0
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I
-  (JNIEnv *env, jobject this_obj, jint jpid) {
-
-  struct ps_prochandle* ph;
-  if ( (ph = Pgrab(jpid)) == NULL) {
-    THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
-  }
-  (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
-  fillThreadsAndLoadObjects(env, this_obj, ph);
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    attach0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2
-  (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
-  const char *execName_cstr;
-  const char *coreName_cstr;
-  jboolean isCopy;
-  struct ps_prochandle* ph;
-
-  execName_cstr = (*env)->GetStringUTFChars(env, execName, &isCopy);
-  CHECK_EXCEPTION;
-  coreName_cstr = (*env)->GetStringUTFChars(env, coreName, &isCopy);
-  CHECK_EXCEPTION;
-
-  if ( (ph = Pgrab_core(execName_cstr, coreName_cstr)) == NULL) {
-    (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
-    (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
-    THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
-  }
-  (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
-  (*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
-  (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
-  fillThreadsAndLoadObjects(env, this_obj, ph);
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    detach0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0
-  (JNIEnv *env, jobject this_obj) {
-  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
-  if (ph != NULL) {
-     Prelease(ph);
-  }
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    lookupByName0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0
-  (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
-  const char *objectName_cstr, *symbolName_cstr;
-  jlong addr;
-  jboolean isCopy;
-  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
-
-  objectName_cstr = NULL;
-  if (objectName != NULL) {
-    objectName_cstr = (*env)->GetStringUTFChars(env, objectName, &isCopy);
-    CHECK_EXCEPTION_(0);
-  }
-  symbolName_cstr = (*env)->GetStringUTFChars(env, symbolName, &isCopy);
-  CHECK_EXCEPTION_(0);
-
-  addr = (jlong) lookup_symbol(ph, objectName_cstr, symbolName_cstr);
-
-  if (objectName_cstr != NULL) {
-    (*env)->ReleaseStringUTFChars(env, objectName, objectName_cstr);
-  }
-  (*env)->ReleaseStringUTFChars(env, symbolName, symbolName_cstr);
-  return addr;
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    lookupByAddress0
- * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
- */
-JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0
-  (JNIEnv *env, jobject this_obj, jlong addr) {
-  uintptr_t offset;
-  const char* sym = NULL;
-
-  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
-  sym = symbol_for_pc(ph, (uintptr_t) addr, &offset);
-  if (sym == NULL) return 0;
-  return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID,
-                          (*env)->NewStringUTF(env, sym), (jlong)offset);
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    readBytesFromProcess0
- * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
- */
-JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0
-  (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
-
-  jboolean isCopy;
-  jbyteArray array;
-  jbyte *bufPtr;
-  ps_err_e err;
-
-  array = (*env)->NewByteArray(env, numBytes);
-  CHECK_EXCEPTION_(0);
-  bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
-  CHECK_EXCEPTION_(0);
-
-  err = ps_pread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
-  (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
-  return (err == PS_OK)? array : 0;
-}
-
-JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0
-  (JNIEnv *env, jobject this_obj, jint lwp_id) {
-
-  struct reg gregs;
-  jboolean isCopy;
-  jlongArray array;
-  jlong *regs;
-
-  struct ps_prochandle* ph = get_proc_handle(env, this_obj);
-  if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
-     THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
-  }
-
-#undef NPRGREG
-#ifdef i386
-#define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
-#endif
-#ifdef amd64
-#define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
-#endif
-#if defined(sparc) || defined(sparcv9)
-#define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
-#endif
-
-  array = (*env)->NewLongArray(env, NPRGREG);
-  CHECK_EXCEPTION_(0);
-  regs = (*env)->GetLongArrayElements(env, array, &isCopy);
-
-#undef REG_INDEX
-
-#ifdef i386
-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
-
-  regs[REG_INDEX(GS)]  = (uintptr_t) gregs.r_gs;
-  regs[REG_INDEX(FS)]  = (uintptr_t) gregs.r_fs;
-  regs[REG_INDEX(ES)]  = (uintptr_t) gregs.r_es;
-  regs[REG_INDEX(DS)]  = (uintptr_t) gregs.r_ds;
-  regs[REG_INDEX(EDI)] = (uintptr_t) gregs.r_edi;
-  regs[REG_INDEX(ESI)] = (uintptr_t) gregs.r_esi;
-  regs[REG_INDEX(FP)] = (uintptr_t) gregs.r_ebp;
-  regs[REG_INDEX(SP)] = (uintptr_t) gregs.r_isp;
-  regs[REG_INDEX(EBX)] = (uintptr_t) gregs.r_ebx;
-  regs[REG_INDEX(EDX)] = (uintptr_t) gregs.r_edx;
-  regs[REG_INDEX(ECX)] = (uintptr_t) gregs.r_ecx;
-  regs[REG_INDEX(EAX)] = (uintptr_t) gregs.r_eax;
-  regs[REG_INDEX(PC)] = (uintptr_t) gregs.r_eip;
-  regs[REG_INDEX(CS)]  = (uintptr_t) gregs.r_cs;
-  regs[REG_INDEX(SS)]  = (uintptr_t) gregs.r_ss;
-
-#endif /* i386 */
-
-#ifdef amd64
-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
-
-  regs[REG_INDEX(R15)] = gregs.r_r15;
-  regs[REG_INDEX(R14)] = gregs.r_r14;
-  regs[REG_INDEX(R13)] = gregs.r_r13;
-  regs[REG_INDEX(R12)] = gregs.r_r12;
-  regs[REG_INDEX(RBP)] = gregs.r_rbp;
-  regs[REG_INDEX(RBX)] = gregs.r_rbx;
-  regs[REG_INDEX(R11)] = gregs.r_r11;
-  regs[REG_INDEX(R10)] = gregs.r_r10;
-  regs[REG_INDEX(R9)] = gregs.r_r9;
-  regs[REG_INDEX(R8)] = gregs.r_r8;
-  regs[REG_INDEX(RAX)] = gregs.r_rax;
-  regs[REG_INDEX(RCX)] = gregs.r_rcx;
-  regs[REG_INDEX(RDX)] = gregs.r_rdx;
-  regs[REG_INDEX(RSI)] = gregs.r_rsi;
-  regs[REG_INDEX(RDI)] = gregs.r_rdi;
-  regs[REG_INDEX(RIP)] = gregs.r_rip;
-  regs[REG_INDEX(CS)] = gregs.r_cs;
-  regs[REG_INDEX(RSP)] = gregs.r_rsp;
-  regs[REG_INDEX(SS)] = gregs.r_ss;
-//  regs[REG_INDEX(FSBASE)] = gregs.fs_base;
-//  regs[REG_INDEX(GSBASE)] = gregs.gs_base;
-//  regs[REG_INDEX(DS)] = gregs.ds;
-//  regs[REG_INDEX(ES)] = gregs.es;
-//  regs[REG_INDEX(FS)] = gregs.fs;
-//  regs[REG_INDEX(GS)] = gregs.gs;
-
-#endif /* amd64 */
-
-#if defined(sparc) || defined(sparcv9)
-
-#define REG_INDEX(reg) sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_##reg
-
-#ifdef _LP64
-  regs[REG_INDEX(R_PSR)] = gregs.tstate;
-  regs[REG_INDEX(R_PC)]  = gregs.tpc;
-  regs[REG_INDEX(R_nPC)] = gregs.tnpc;
-  regs[REG_INDEX(R_Y)]   = gregs.y;
-#else
-  regs[REG_INDEX(R_PSR)] = gregs.psr;
-  regs[REG_INDEX(R_PC)]  = gregs.pc;
-  regs[REG_INDEX(R_nPC)] = gregs.npc;
-  regs[REG_INDEX(R_Y)]   = gregs.y;
-#endif
-  regs[REG_INDEX(R_G0)]  =            0 ;
-  regs[REG_INDEX(R_G1)]  = gregs.u_regs[0];
-  regs[REG_INDEX(R_G2)]  = gregs.u_regs[1];
-  regs[REG_INDEX(R_G3)]  = gregs.u_regs[2];
-  regs[REG_INDEX(R_G4)]  = gregs.u_regs[3];
-  regs[REG_INDEX(R_G5)]  = gregs.u_regs[4];
-  regs[REG_INDEX(R_G6)]  = gregs.u_regs[5];
-  regs[REG_INDEX(R_G7)]  = gregs.u_regs[6];
-  regs[REG_INDEX(R_O0)]  = gregs.u_regs[7];
-  regs[REG_INDEX(R_O1)]  = gregs.u_regs[8];
-  regs[REG_INDEX(R_O2)]  = gregs.u_regs[ 9];
-  regs[REG_INDEX(R_O3)]  = gregs.u_regs[10];
-  regs[REG_INDEX(R_O4)]  = gregs.u_regs[11];
-  regs[REG_INDEX(R_O5)]  = gregs.u_regs[12];
-  regs[REG_INDEX(R_O6)]  = gregs.u_regs[13];
-  regs[REG_INDEX(R_O7)]  = gregs.u_regs[14];
-#endif /* sparc */
-
-
-  (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
-  return array;
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/StubDebuggerLocal.c	Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdlib.h>
-#include <jni.h>
-
-#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
-#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
-#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
-#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
-
-static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
-  (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    init0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0
-  (JNIEnv *env, jclass cls) {
-}
-
-JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize
-  (JNIEnv *env, jclass cls)
-{
-#ifdef _LP64
- return 8;
-#else
- return 4;
-#endif
-
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    attach0
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I
-  (JNIEnv *env, jobject this_obj, jint jpid) {
-
-  THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    attach0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2
-  (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
-  THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    detach0
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0
-  (JNIEnv *env, jobject this_obj) {
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    lookupByName0
- * Signature: (Ljava/lang/String;Ljava/lang/String;)J
- */
-JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0
-  (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
-  return 0;
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    lookupByAddress0
- * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
- */
-JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0
-  (JNIEnv *env, jobject this_obj, jlong addr) {
-  return 0;
-}
-
-/*
- * Class:     sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
- * Method:    readBytesFromProcess0
- * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
- */
-JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0
-  (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
-  return 0;
-}
-
-JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0
-  (JNIEnv *env, jobject this_obj, jint lwp_id) {
-  return 0;
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/ps_proc.c	Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,467 +0,0 @@
-/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/ptrace.h>
-#include <sys/param.h>
-#include <sys/user.h>
-#include <elf.h>
-#include <sys/elf_common.h>
-#include <sys/link_elf.h>
-#include <libutil.h>
-#include "libproc_impl.h"
-#include "elfmacros.h"
-
-// This file has the libproc implementation specific to live process
-// For core files, refer to ps_core.c
-
-static inline uintptr_t align(uintptr_t ptr, size_t size) {
-  return (ptr & ~(size - 1));
-}
-
-// ---------------------------------------------
-// ptrace functions
-// ---------------------------------------------
-
-// read "size" bytes of data from "addr" within the target process.
-// unlike the standard ptrace() function, process_read_data() can handle
-// unaligned address - alignment check, if required, should be done
-// before calling process_read_data.
-
-static bool process_read_data(struct ps_prochandle* ph, uintptr_t addr, char *buf, size_t size) {
-  int rslt;
-  size_t i, words;
-  uintptr_t end_addr = addr + size;
-  uintptr_t aligned_addr = align(addr, sizeof(int));
-
-  if (aligned_addr != addr) {
-    char *ptr = (char *)&rslt;
-    errno = 0;
-    rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
-    if (errno) {
-      print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
-      return false;
-    }
-    for (; aligned_addr != addr; aligned_addr++, ptr++);
-    for (; ((intptr_t)aligned_addr % sizeof(int)) && aligned_addr < end_addr;
-        aligned_addr++)
-       *(buf++) = *(ptr++);
-  }
-
-  words = (end_addr - aligned_addr) / sizeof(int);
-
-  // assert((intptr_t)aligned_addr % sizeof(int) == 0);
-  for (i = 0; i < words; i++) {
-    errno = 0;
-    rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
-    if (errno) {
-      print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
-      return false;
-    }
-    *(int *)buf = rslt;
-    buf += sizeof(int);
-    aligned_addr += sizeof(int);
-  }
-
-  if (aligned_addr != end_addr) {
-    char *ptr = (char *)&rslt;
-    errno = 0;
-    rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
-    if (errno) {
-      print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
-      return false;
-    }
-    for (; aligned_addr != end_addr; aligned_addr++)
-       *(buf++) = *(ptr++);
-  }
-  return true;
-}
-
-// null implementation for write
-static bool process_write_data(struct ps_prochandle* ph,
-                             uintptr_t addr, const char *buf , size_t size) {
-  return false;
-}
-
-// "user" should be a pointer to a reg
-static bool process_get_lwp_regs(struct ps_prochandle* ph, pid_t pid, struct reg *user) {
-  // we have already attached to all thread 'pid's, just use ptrace call
-  // to get regset now. Note that we don't cache regset upfront for processes.
- if (ptrace(PT_GETREGS, pid, (caddr_t) user, 0) < 0) {
-   print_debug("ptrace(PTRACE_GETREGS, ...) failed for lwp %d\n", pid);
-   return false;
- }
- return true;
-}
-
-// fill in ptrace_lwpinfo for lid
-static bool process_get_lwp_info(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) {
-  errno = 0;
-  ptrace(PT_LWPINFO, lwp_id, linfo, sizeof(struct ptrace_lwpinfo));
-
-  return (errno == 0)? true: false;
-}
-
-static bool ptrace_continue(pid_t pid, int signal) {
-  // pass the signal to the process so we don't swallow it
-  if (ptrace(PT_CONTINUE, pid, NULL, signal) < 0) {
-    print_debug("ptrace(PTRACE_CONT, ..) failed for %d\n", pid);
-    return false;
-  }
-  return true;
-}
-
-// waits until the ATTACH has stopped the process
-// by signal SIGSTOP
-static bool ptrace_waitpid(pid_t pid) {
-  int ret;
-  int status;
-  do {
-    // Wait for debuggee to stop.
-    ret = waitpid(pid, &status, 0);
-    if (ret >= 0) {
-      if (WIFSTOPPED(status)) {
-        // Any signal will stop the thread, make sure it is SIGSTOP. Otherwise SIGSTOP
-        // will still be pending and delivered when the process is DETACHED and the process
-        // will go to sleep.
-        if (WSTOPSIG(status) == SIGSTOP) {
-          // Debuggee stopped by SIGSTOP.
-          return true;
-        }
-        if (!ptrace_continue(pid, WSTOPSIG(status))) {
-          print_error("Failed to correctly attach to VM. VM might HANG! [PTRACE_CONT failed, stopped by %d]\n", WSTOPSIG(status));
-          return false;
-        }
-      } else {
-        print_debug("waitpid(): Child process exited/terminated (status = 0x%x)\n", status);
-        return false;
-      }
-    } else {
-      switch (errno) {
-        case EINTR:
-          continue;
-          break;
-        case ECHILD:
-          print_debug("waitpid() failed. Child process pid (%d) does not exist \n", pid);
-          break;
-        case EINVAL:
-          print_debug("waitpid() failed. Invalid options argument.\n");
-          break;
-        default:
-          print_debug("waitpid() failed. Unexpected error %d\n",errno);
-      }
-      return false;
-    }
-  } while(true);
-}
-
-// attach to a process/thread specified by "pid"
-static bool ptrace_attach(pid_t pid) {
-  if (ptrace(PT_ATTACH, pid, NULL, 0) < 0) {
-    print_debug("ptrace(PTRACE_ATTACH, ..) failed for %d\n", pid);
-    return false;
-  } else {
-    return ptrace_waitpid(pid);
-  }
-}
-
-// -------------------------------------------------------
-// functions for obtaining library information
-// -------------------------------------------------------
-
-// callback for read_thread_info
-static bool add_new_thread(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
-  return add_thread_info(ph, pthread_id, lwp_id) != NULL;
-}
-
-#if defined(__FreeBSD__) && __FreeBSD_version < 701000
-/*
- * TEXT_START_ADDR from binutils/ld/emulparams/<arch_spec>.sh
- * Not the most robust but good enough.
- */
-
-#if defined(amd64) || defined(x86_64)
-#define TEXT_START_ADDR 0x400000
-#elif defined(i386)
-#define TEXT_START_ADDR 0x8048000
-#else
-#error TEXT_START_ADDR not defined
-#endif
-
-#define BUF_SIZE (PATH_MAX + NAME_MAX + 1)
-
-uintptr_t linkmap_addr(struct ps_prochandle *ph) {
-  uintptr_t ehdr_addr, phdr_addr, dyn_addr, dmap_addr, lmap_addr;
-  ELF_EHDR ehdr;
-  ELF_PHDR *phdrs, *phdr;
-  ELF_DYN *dyns, *dyn;
-  struct r_debug dmap;
-  unsigned long hdrs_size;
-  unsigned int i;
-
-  /* read ELF_EHDR at TEXT_START_ADDR and validate */
-
-  ehdr_addr = (uintptr_t)TEXT_START_ADDR;
-
-  if (process_read_data(ph, ehdr_addr, (char *)&ehdr, sizeof(ehdr)) != true) {
-    print_debug("process_read_data failed for ehdr_addr %p\n", ehdr_addr);
-    return (0);
-  }
-
-  if (!IS_ELF(ehdr) ||
-        ehdr.e_ident[EI_CLASS] != ELF_TARG_CLASS ||
-        ehdr.e_ident[EI_DATA] != ELF_TARG_DATA ||
-        ehdr.e_ident[EI_VERSION] != EV_CURRENT ||
-        ehdr.e_phentsize != sizeof(ELF_PHDR) ||
-        ehdr.e_version != ELF_TARG_VER ||
-        ehdr.e_machine != ELF_TARG_MACH) {
-    print_debug("not an ELF_EHDR at %p\n", ehdr_addr);
-    return (0);
-  }
-
-  /* allocate space for all ELF_PHDR's and read */
-
-  phdr_addr = ehdr_addr + ehdr.e_phoff;
-  hdrs_size = ehdr.e_phnum * sizeof(ELF_PHDR);
-
-  if ((phdrs = malloc(hdrs_size)) == NULL)
-    return (0);
-
-  if (process_read_data(ph, phdr_addr, (char *)phdrs, hdrs_size) != true) {
-    print_debug("process_read_data failed for phdr_addr %p\n", phdr_addr);
-    return (0);
-  }
-
-  /* find PT_DYNAMIC section */
-
-  for (i = 0, phdr = phdrs; i < ehdr.e_phnum; i++, phdr++) {
-    if (phdr->p_type == PT_DYNAMIC)
-      break;
-  }
-
-  if (i >= ehdr.e_phnum) {
-    print_debug("PT_DYNAMIC section not found!\n");
-    free(phdrs);
-    return (0);
-  }
-
-  /* allocate space and read in ELF_DYN headers */
-
-  dyn_addr = phdr->p_vaddr;
-  hdrs_size = phdr->p_memsz;
-  free(phdrs);
-
-  if ((dyns = malloc(hdrs_size)) == NULL)
-    return (0);
-
-  if (process_read_data(ph, dyn_addr, (char *)dyns, hdrs_size) != true) {
-    print_debug("process_read_data failed for dyn_addr %p\n", dyn_addr);
-    free(dyns);
-    return (0);
-  }
-
-  /* find DT_DEBUG */
-
-  dyn = dyns;
-  while (dyn->d_tag != DT_DEBUG && dyn->d_tag != DT_NULL) {
-    dyn++;
-  }
-
-  if (dyn->d_tag != DT_DEBUG) {
-    print_debug("failed to find DT_DEBUG\n");
-    free(dyns);
-    return (0);
-  }
-
-  /* read struct r_debug into dmap */
-
-  dmap_addr = (uintptr_t)dyn->d_un.d_ptr;
-  free(dyns);
-
-  if (process_read_data(ph, dmap_addr, (char *)&dmap, sizeof(dmap)) != true) {
-    print_debug("process_read_data failed for dmap_addr %p\n", dmap_addr);
-    return (0);
-  }
-
-  lmap_addr = (uintptr_t)dmap.r_map;
-
-  return (lmap_addr);
-}
-#endif // __FreeBSD__ && __FreeBSD_version < 701000
-
-static bool read_lib_info(struct ps_prochandle* ph) {
-#if defined(__FreeBSD__) && __FreeBSD_version >= 701000
-  struct kinfo_vmentry *freep, *kve;
-  int i, cnt;
-
-  freep = kinfo_getvmmap(ph->pid, &cnt);
-  if (freep == NULL) {
-      print_debug("can't get vm map for pid\n", ph->pid);
-      return false;
-  }
-
-  for (i = 0; i < cnt; i++) {
-    kve = &freep[i];
-    if ((kve->kve_flags & KVME_FLAG_COW) &&
-        kve->kve_path != NULL &&
-        strlen(kve->kve_path) > 0) {
-
-      if (find_lib(ph, kve->kve_path) == false) {
-        lib_info* lib;
-        if ((lib = add_lib_info(ph, kve->kve_path,
-                                (uintptr_t) kve->kve_start)) == NULL)
-          continue; // ignore, add_lib_info prints error
-
-        // we don't need to keep the library open, symtab is already
-        // built. Only for core dump we need to keep the fd open.
-        close(lib->fd);
-        lib->fd = -1;
-      }
-    }
-  }
-
-  free(freep);
-
-  return true;
-#else
-  char *l_name;
-  struct link_map *lmap;
-  uintptr_t lmap_addr;
-
-  if ((l_name = malloc(BUF_SIZE)) == NULL)
-    return false;
-
-  if ((lmap = malloc(sizeof(*lmap))) == NULL) {
-    free(l_name);
-    return false;
-  }
-
-  lmap_addr = linkmap_addr(ph);
-
-  if (lmap_addr == 0) {
-    free(l_name);
-    free(lmap);
-    return false;
-  }
-
-  do {
-    if (process_read_data(ph, lmap_addr, (char *)lmap, sizeof(*lmap)) != true) {
-      print_debug("process_read_data failed for lmap_addr %p\n", lmap_addr);
-      free (l_name);
-      free (lmap);
-      return false;
-    }
-
-    if (process_read_data(ph, (uintptr_t)lmap->l_name, l_name,
-        BUF_SIZE) != true) {
-      print_debug("process_read_data failed for lmap->l_name %p\n",
-          lmap->l_name);
-      free (l_name);
-      free (lmap);
-      return false;
-    }
-
-    if (find_lib(ph, l_name) == false) {
-      lib_info* lib;
-      if ((lib = add_lib_info(ph, l_name,
-                              (uintptr_t) lmap->l_addr)) == NULL)
-        continue; // ignore, add_lib_info prints error
-
-      // we don't need to keep the library open, symtab is already
-      // built. Only for core dump we need to keep the fd open.
-      close(lib->fd);
-      lib->fd = -1;
-    }
-    lmap_addr = (uintptr_t)lmap->l_next;
-  } while (lmap->l_next != NULL);
-
-  free (l_name);
-  free (lmap);
-
-  return true;
-#endif
-}
-
-// detach a given pid
-static bool ptrace_detach(pid_t pid) {
-  if (pid && ptrace(PT_DETACH, pid, (caddr_t)1, 0) < 0) {
-    print_debug("ptrace(PTRACE_DETACH, ..) failed for %d\n", pid);
-    return false;
-  } else {
-    return true;
-  }
-}
-
-static void process_cleanup(struct ps_prochandle* ph) {
-  ptrace_detach(ph->pid);
-}
-
-static ps_prochandle_ops process_ops = {
-  .release=  process_cleanup,
-  .p_pread=  process_read_data,
-  .p_pwrite= process_write_data,
-  .get_lwp_regs= process_get_lwp_regs,
-  .get_lwp_info= process_get_lwp_info
-};
-
-// attach to the process. One and only one exposed stuff
-struct ps_prochandle* Pgrab(pid_t pid) {
-  struct ps_prochandle* ph = NULL;
-
-  if ( (ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle))) == NULL) {
-     print_debug("can't allocate memory for ps_prochandle\n");
-     return NULL;
-  }
-
-  if (ptrace_attach(pid) != true) {
-     free(ph);
-     return NULL;
-  }
-
-  // initialize ps_prochandle
-  ph->pid = pid;
-
-  // initialize vtable
-  ph->ops = &process_ops;
-
-  // read library info and symbol tables, must do this before attaching threads,
-  // as the symbols in the pthread library will be used to figure out
-  // the list of threads within the same process.
-  if (read_lib_info(ph) != true) {
-     ptrace_detach(pid);
-     free(ph);
-     return NULL;
-  }
-
-  // read thread info
-  read_thread_info(ph, add_new_thread);
-
-  return ph;
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/salibelf.c	Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include "salibelf.h"
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-extern void print_debug(const char*,...);
-
-// ELF file parsing helpers. Note that we do *not* use libelf here.
-int read_elf_header(int fd, ELF_EHDR* ehdr) {
-   if (pread(fd, ehdr, sizeof (ELF_EHDR), 0) != sizeof (ELF_EHDR) ||
-            memcmp(&ehdr->e_ident[EI_MAG0], ELFMAG, SELFMAG) != 0 ||
-            ehdr->e_version != EV_CURRENT) {
-        return 0;
-   }
-   return 1;
-}
-
-bool is_elf_file(int fd) {
-   ELF_EHDR ehdr;
-   return read_elf_header(fd, &ehdr);
-}
-
-// read program header table of an ELF file
-ELF_PHDR* read_program_header_table(int fd, ELF_EHDR* hdr) {
-   ELF_PHDR* phbuf = 0;
-   // allocate memory for program header table
-   size_t nbytes = hdr->e_phnum * hdr->e_phentsize;
-
-   if ((phbuf = (ELF_PHDR*) malloc(nbytes)) == NULL) {
-      print_debug("can't allocate memory for reading program header table\n");
-      return NULL;
-   }
-
-   if (pread(fd, phbuf, nbytes, hdr->e_phoff) != nbytes) {
-      print_debug("ELF file is truncated! can't read program header table\n");
-      free(phbuf);
-      return NULL;
-   }
-
-   return phbuf;
-}
-
-// read section header table of an ELF file
-ELF_SHDR* read_section_header_table(int fd, ELF_EHDR* hdr) {
-   ELF_SHDR* shbuf = 0;
-   // allocate memory for section header table
-   size_t nbytes = hdr->e_shnum * hdr->e_shentsize;
-
-   if ((shbuf = (ELF_SHDR*) malloc(nbytes)) == NULL) {
-      print_debug("can't allocate memory for reading section header table\n");
-      return NULL;
-   }
-
-   if (pread(fd, shbuf, nbytes, hdr->e_shoff) != nbytes) {
-      print_debug("ELF file is truncated! can't read section header table\n");
-      free(shbuf);
-      return NULL;
-   }
-
-   return shbuf;
-}
-
-// read a particular section's data
-void* read_section_data(int fd, ELF_EHDR* ehdr, ELF_SHDR* shdr) {
-  void *buf = NULL;
-  if (shdr->sh_type == SHT_NOBITS || shdr->sh_size == 0) {
-     return buf;
-  }
-  if ((buf = calloc(shdr->sh_size, 1)) == NULL) {
-     print_debug("can't allocate memory for reading section data\n");
-     return NULL;
-  }
-  if (pread(fd, buf, shdr->sh_size, shdr->sh_offset) != shdr->sh_size) {
-     free(buf);
-     print_debug("section data read failed\n");
-     return NULL;
-  }
-  return buf;
-}
-
-uintptr_t find_base_address(int fd, ELF_EHDR* ehdr) {
-  uintptr_t baseaddr = (uintptr_t)-1;
-  int cnt;
-  ELF_PHDR *phbuf, *phdr;
-
-  // read program header table
-  if ((phbuf = read_program_header_table(fd, ehdr)) == NULL) {
-    goto quit;
-  }
-
-  // the base address of a shared object is the lowest vaddr of
-  // its loadable segments (PT_LOAD)
-  for (phdr = phbuf, cnt = 0; cnt < ehdr->e_phnum; cnt++, phdr++) {
-    if (phdr->p_type == PT_LOAD && phdr->p_vaddr < baseaddr) {
-      baseaddr = phdr->p_vaddr;
-    }
-  }
-
-quit:
-  if (phbuf) free(phbuf);
-  return baseaddr;
-}
--- a/src/jdk.hotspot.agent/macosx/native/libsaproc/test.c	Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2003, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "libproc.h"
-
-int main(int argc, char** argv) {
-   struct ps_prochandle* ph;
-
-   init_libproc(true);
-   switch (argc) {
-      case 2: {
-         // process
-         ph = Pgrab(atoi(argv[1]));
-         break;
-      }
-
-      case 3: {
-        // core
-        ph = Pgrab_core(argv[1], argv[2]);
-        break;
-      }
-
-      default: {
-        fprintf(stderr, "usage %s <pid> or %s <exec file> <core file>\n", argv[0], argv[0]);
-        return 1;
-      }
-   }
-
-   if (ph) {
-      Prelease(ph);
-      return 0;
-   } else {
-      printf("can't connect to debuggee\n");
-      return 1;
-   }
-}
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, Oracle and/or its affiliates. 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
@@ -510,7 +510,7 @@
     static {
 
      /*
-      * sawindbg.dll depends on dbgeng.dll which itself depends on
+      * saproc.dll depends on dbgeng.dll which itself depends on
       * dbghelp.dll. We have to make sure that the dbgeng.dll and
       * dbghelp.dll that we load are compatible with each other. We
       * load both of those libraries from the same directory based
@@ -538,18 +538,18 @@
 
     String dbgengPath   = null;
     String dbghelpPath  = null;
-    String sawindbgPath = null;
+    String saprocPath = null;
     List   searchList   = new ArrayList();
 
     boolean loadLibraryDEBUG =
         System.getProperty("sun.jvm.hotspot.loadLibrary.DEBUG") != null;
 
     {
-      // First place to search is co-located with sawindbg.dll in
+      // First place to search is co-located with saproc.dll in
       // $JAVA_HOME/jre/bin (java.home property is set to $JAVA_HOME/jre):
       searchList.add(System.getProperty("java.home") + File.separator + "bin");
-      sawindbgPath = (String) searchList.get(0) + File.separator +
-          "sawindbg.dll";
+      saprocPath = (String) searchList.get(0) + File.separator +
+          "saproc.dll";
 
       // second place to search is specified by an environment variable:
       String DTFWHome = System.getenv("DEBUGGINGTOOLSFORWINDOWS");
@@ -646,11 +646,11 @@
     }
     System.load(dbgengPath);
 
-    // Now, load sawindbg.dll
+    // Now, load saproc.dll
     if (loadLibraryDEBUG) {
-      System.err.println("DEBUG: loading '" + sawindbgPath + "'.");
+      System.err.println("DEBUG: loading '" + saprocPath + "'.");
     }
-    System.load(sawindbgPath);
+    System.load(saprocPath);
 
     // where do I find '.exe', '.dll' files?
     imagePath = System.getProperty("sun.jvm.hotspot.debugger.windbg.imagePath");
--- a/src/jdk.hotspot.agent/solaris/native/libsaproc/saproc_audit.cpp	Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2009, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- *
- */
-
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <varargs.h>
-
-// This class sets up an interposer on open calls from libproc.so to
-// support a pathmap facility in the SA.
-
-static uintptr_t* libproc_cookie;
-static uintptr_t* libc_cookie;
-static uintptr_t* libsaproc_cookie;
-
-
-uint_t
-la_version(uint_t version)
-{
-  return (LAV_CURRENT);
-}
-
-
-uint_t
-la_objopen(Link_map * lmp, Lmid_t lmid, uintptr_t * cookie)
-{
-  if (strstr(lmp->l_name, "/libproc.so") != NULL) {
-    libproc_cookie = cookie;
-    return LA_FLG_BINDFROM;
-  }
-  if (strstr(lmp->l_name, "/libc.so") != NULL) {
-    libc_cookie = cookie;
-    return LA_FLG_BINDTO;
-  }
-  if (strstr(lmp->l_name, "/libsaproc.so") != NULL) {
-    libsaproc_cookie = cookie;
-    return LA_FLG_BINDTO | LA_FLG_BINDFROM;
-  }
-  return 0;
-}
-
-
-#if     defined(_LP64)
-uintptr_t
-la_symbind64(Elf64_Sym *symp, uint_t symndx, uintptr_t *refcook,
-             uintptr_t *defcook, uint_t *sb_flags, const char *sym_name)
-#else
-uintptr_t
-la_symbind32(Elf32_Sym *symp, uint_t symndx, uintptr_t *refcook,
-             uintptr_t *defcook, uint_t *sb_flags)
-#endif
-{
-#if     !defined(_LP64)
-  const char      *sym_name = (const char *)symp->st_name;
-#endif
-  if (strcmp(sym_name, "open") == 0 && refcook == libproc_cookie) {
-    // redirect all open calls from libproc.so through libsaproc_open which will
-    // try the alternate library locations first.
-    void* handle = dlmopen(LM_ID_BASE, "libsaproc.so", RTLD_NOLOAD);
-    if (handle == NULL) {
-      fprintf(stderr, "libsaproc_audit.so: didn't find libsaproc.so during linking\n");
-    } else {
-      uintptr_t libsaproc_open = (uintptr_t)dlsym(handle, "libsaproc_open");
-      if (libsaproc_open == 0) {
-        fprintf(stderr, "libsaproc_audit.so: didn't find libsaproc_open during linking\n");
-      } else {
-        return libsaproc_open;
-      }
-    }
-  }
-  return symp->st_value;
-}
--- a/src/jdk.hotspot.agent/windows/native/libsaproc/sawindbg.cpp	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.hotspot.agent/windows/native/libsaproc/sawindbg.cpp	Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, Oracle and/or its affiliates. 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
@@ -43,10 +43,6 @@
 #include <limits.h>
 #include <windows.h>
 
-#ifndef STDMETHODV
-#define STDMETHODV(method) virtual HRESULT STDMETHODVCALLTYPE method
-#endif
-
 #define DEBUG_NO_IMPLEMENTATION
 #include <dbgeng.h>
 #include <dbghelp.h>
--- a/src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/ServerImpl.java	Thu Mar 22 11:34:38 2018 -0700
@@ -407,7 +407,7 @@
                                     }
                                     handle (chan, conn);
                                 } else {
-                                    assert false;
+                                    assert false : "Unexpected non-readable key:" + key;
                                 }
                             } catch (CancelledKeyException e) {
                                 handleException(key, null);
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/LengthNotWritableFilter.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/LengthNotWritableFilter.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1,3 +1,28 @@
+/*
+ * Copyright (c) 2014, 2018, Oracle and/or its affiliates. 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
 package jdk.nashorn.internal.runtime.arrays;
 
 import java.util.Iterator;
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NonExtensibleArrayFilter.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NonExtensibleArrayFilter.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1,3 +1,28 @@
+/*
+ * Copyright (c) 2014, 2018, Oracle and/or its affiliates. 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
 package jdk.nashorn.internal.runtime.arrays;
 
 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
--- a/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. 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
@@ -33,7 +33,6 @@
 import sun.nio.ch.DirectBuffer;
 
 import java.lang.reflect.Field;
-import java.security.ProtectionDomain;
 
 
 /**
@@ -811,25 +810,6 @@
     /// random trusted operations from JNI:
 
     /**
-     * Tells the VM to define a class, without security checks.  By default, the
-     * class loader and protection domain come from the caller's class.
-     *
-     * @deprecated Use {@link java.lang.invoke.MethodHandles.Lookup#defineClass MethodHandles.Lookup#defineClass}
-     * to define a class to the same class loader and in the same runtime package
-     * and {@linkplain java.security.ProtectionDomain protection domain} of a
-     * given {@code Lookup}'s {@linkplain java.lang.invoke.MethodHandles.Lookup#lookupClass() lookup class}.
-     *
-     * @see java.lang.invoke.MethodHandles.Lookup#defineClass(byte[])
-     */
-    @Deprecated(since="9", forRemoval=true)
-    @ForceInline
-    public Class<?> defineClass(String name, byte[] b, int off, int len,
-                                ClassLoader loader,
-                                ProtectionDomain protectionDomain) {
-        return theInternalUnsafe.defineClass(name, b, off, len, loader, protectionDomain);
-    }
-
-    /**
      * Defines a class but does not make it known to the class loader or system dictionary.
      * <p>
      * For each CP entry, the corresponding CP patch must either be null or have
--- a/test/jdk/java/nio/Buffer/EqualsCompareTest.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/test/jdk/java/nio/Buffer/EqualsCompareTest.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. 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
@@ -45,7 +45,7 @@
 
 /*
  * @test
- * @bug 8193085
+ * @bug 8193085 8199773
  * @summary tests for buffer equals and compare
  * @run testng EqualsCompareTest
  */
@@ -120,8 +120,9 @@
         abstract T construct(int length, ByteOrder bo);
 
         @SuppressWarnings("unchecked")
-        T slice(T a, int from, int to) {
-            return (T) a.position(from).limit(to).slice();
+        T slice(T a, int from, int to, boolean dupOtherwiseSlice) {
+            a = (T) a.position(from).limit(to);
+            return (T) (dupOtherwiseSlice ? a.duplicate() : a.slice());
         }
 
         @SuppressWarnings("unchecked")
@@ -607,60 +608,62 @@
                         BiFunction<BT, Integer, B> bConstructor) {
         int n = arraySizeFor(bt.elementType);
 
-        for (int s : ranges(0, n)) {
-            B a = aConstructor.apply(bt, s);
-            B b = bConstructor.apply(bt, s);
+        for (boolean dupOtherwiseSlice : new boolean[]{ false, true }) {
+            for (int s : ranges(0, n)) {
+                B a = aConstructor.apply(bt, s);
+                B b = bConstructor.apply(bt, s);
 
-            for (int aFrom : ranges(0, s)) {
-                for (int aTo : ranges(aFrom, s)) {
-                    int aLength = aTo - aFrom;
+                for (int aFrom : ranges(0, s)) {
+                    for (int aTo : ranges(aFrom, s)) {
+                        int aLength = aTo - aFrom;
 
-                    B as = aLength != s
-                           ? bt.slice(a, aFrom, aTo)
-                           : a;
+                        B as = aLength != s
+                               ? bt.slice(a, aFrom, aTo, dupOtherwiseSlice)
+                               : a;
 
-                    for (int bFrom : ranges(0, s)) {
-                        for (int bTo : ranges(bFrom, s)) {
-                            int bLength = bTo - bFrom;
+                        for (int bFrom : ranges(0, s)) {
+                            for (int bTo : ranges(bFrom, s)) {
+                                int bLength = bTo - bFrom;
+
+                                B bs = bLength != s
+                                       ? bt.slice(b, bFrom, bTo, dupOtherwiseSlice)
+                                       : b;
 
-                            B bs = bLength != s
-                                   ? bt.slice(b, bFrom, bTo)
-                                   : b;
+                                boolean eq = bt.pairWiseEquals(as, bs);
+                                Assert.assertEquals(bt.equals(as, bs), eq);
+                                Assert.assertEquals(bt.equals(bs, as), eq);
+                                if (eq) {
+                                    Assert.assertEquals(bt.compare(as, bs), 0);
+                                    Assert.assertEquals(bt.compare(bs, as), 0);
+                                }
+                                else {
+                                    int aCb = bt.compare(as, bs);
+                                    int bCa = bt.compare(bs, as);
+                                    int v = Integer.signum(aCb) * Integer.signum(bCa);
+                                    Assert.assertTrue(v == -1);
+                                }
+                            }
+                        }
 
-                            boolean eq = bt.pairWiseEquals(as, bs);
-                            Assert.assertEquals(bt.equals(as, bs), eq);
-                            Assert.assertEquals(bt.equals(bs, as), eq);
-                            if (eq) {
-                                Assert.assertEquals(bt.compare(as, bs), 0);
-                                Assert.assertEquals(bt.compare(bs, as), 0);
-                            }
-                            else {
-                                int aCb = bt.compare(as, bs);
-                                int bCa = bt.compare(bs, as);
-                                int v = Integer.signum(aCb) * Integer.signum(bCa);
+                        if (aLength > 0 && !a.isReadOnly()) {
+                            for (int i = aFrom; i < aTo; i++) {
+                                B c = aConstructor.apply(bt, a.capacity());
+                                B cs = aLength != s
+                                       ? bt.slice(c, aFrom, aTo, dupOtherwiseSlice)
+                                       : c;
+
+                                // Create common prefix with a length of i - aFrom
+                                bt.set(c, i, -1);
+
+                                Assert.assertFalse(bt.equals(c, a));
+
+                                int cCa = bt.compare(cs, as);
+                                int aCc = bt.compare(as, cs);
+                                int v = Integer.signum(cCa) * Integer.signum(aCc);
                                 Assert.assertTrue(v == -1);
                             }
                         }
                     }
-
-                    if (aLength > 0 && !a.isReadOnly()) {
-                        for (int i = aFrom; i < aTo; i++) {
-                            B c = aConstructor.apply(bt, a.capacity());
-                            B cs = aLength != s
-                                   ? bt.slice(c, aFrom, aTo)
-                                   : c;
-
-                            // Create common prefix with a length of i - aFrom
-                            bt.set(c, i, -1);
-
-                            Assert.assertFalse(bt.equals(c, a));
-
-                            int cCa = bt.compare(cs, as);
-                            int aCc = bt.compare(as, cs);
-                            int v = Integer.signum(cCa) * Integer.signum(aCc);
-                            Assert.assertTrue(v == -1);
-                        }
-                    }
                 }
             }
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/Formatter/NoGroupingUsed.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 8196399
+ * @summary test Formatter if any ArithmeticException is thrown while
+ *          formatting a number in the locale which does not use any
+ *          grouping, but specifies a grouping separator e.g. hy_AM.
+ * @modules jdk.localedata
+ */
+import java.util.Formatter;
+import java.util.Locale;
+
+public class NoGroupingUsed {
+
+    public static void main(String[] args) {
+
+        Locale locale = new Locale("hy", "AM");
+        String number = "1234567";
+        String formatString = "%,d";
+
+        try {
+            testGrouping(locale, formatString, number);
+        } catch (ArithmeticException ex) {
+            throw new RuntimeException("[FAILED: ArithmeticException occurred"
+                    + " while formatting the number: " + number + ", with"
+                    + " format string: " + formatString + ", in locale: "
+                    + locale, ex);
+        }
+
+    }
+
+    private static void testGrouping(Locale locale, String formatString, String number) {
+
+        // test using String.format
+        String result = String.format(locale, formatString, Integer.parseInt(number));
+        if (!number.equals(result)) {
+            throw new RuntimeException("[FAILED: Incorrect formatting"
+                    + " of number: " + number + " using String.format with format"
+                    + " string: " + formatString + " in locale: " + locale
+                    + ". Actual: " + result + ", Expected: " + number + "]");
+        }
+
+        // test using Formatter's format
+        StringBuilder sb = new StringBuilder();
+        Formatter formatter = new Formatter(sb, locale);
+        formatter.format(formatString, Integer.parseInt(number));
+        if (!number.equals(sb.toString())) {
+            throw new RuntimeException("[FAILED: Incorrect formatting"
+                    + " of number: " + number + "using Formatter.format with"
+                    + " format string: " + formatString + " in locale: " + locale
+                    + ". Actual: " + sb.toString() + ", Expected: " + number + "]");
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/Formatter/spi/FormatterWithProvider.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 8199672
+ * @summary test the Formatter.format() method with java.locale.providers=SPI,
+ *          COMPAT. It should not throw ClassCastException if an SPI is
+ *          used and NumberFormat.getInstance() does not return a
+ *          DecimalFormat object.
+ * @modules jdk.localedata
+ * @library provider
+ * @build provider/module-info provider/test.NumberFormatProviderImpl
+ * @run main/othervm -Djava.locale.providers=SPI,COMPAT FormatterWithProvider
+ */
+
+import java.util.Formatter;
+import java.util.Locale;
+
+public class FormatterWithProvider {
+
+    public static void main(String[] args) {
+
+        Integer number = 1234567;
+        String formatString = "%,d";
+
+        try {
+            testFormatter(Locale.JAPANESE, formatString, number);
+            testFormatter(Locale.FRENCH, formatString, number);
+            testFormatter(new Locale("hi", "IN"), formatString, number);
+
+        } catch (ClassCastException ex) {
+            throw new RuntimeException("[FAILED: A ClassCastException is" +
+                    " thrown while using Formatter.format() with VM" +
+                    " argument java.locale.providers=SPI,COMPAT]", ex);
+        }
+    }
+
+    private static void testFormatter(Locale locale, String formatString,
+                                      Integer number) {
+
+        // test using String.format
+        String.format(locale, formatString, number);
+        // test using Formatter's format
+        Formatter formatter = new Formatter(locale);
+        formatter.format(formatString, number);
+    }
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/Formatter/spi/provider/module-info.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+*/
+module provider {
+    exports test;
+    provides java.text.spi.NumberFormatProvider with test.NumberFormatProviderImpl;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/Formatter/spi/provider/test/NumberFormatProviderImpl.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package test;
+
+import java.text.FieldPosition;
+import java.text.NumberFormat;
+import java.text.ParsePosition;
+import java.text.spi.NumberFormatProvider;
+import java.util.Locale;
+
+public class NumberFormatProviderImpl extends NumberFormatProvider {
+
+    private static final Locale[] locales = {Locale.FRENCH, Locale.JAPANESE,
+            new Locale("hi", "IN")};
+
+    @Override
+    public NumberFormat getCurrencyInstance(Locale locale) {
+        return null;
+    }
+
+    @Override
+    public NumberFormat getIntegerInstance(Locale locale) {
+        return null;
+    }
+
+    @Override
+    public NumberFormat getNumberInstance(Locale locale) {
+        return null;
+    }
+
+    @Override
+    public NumberFormat getPercentInstance(Locale locale) {
+        return null;
+    }
+
+    @Override
+    public Locale[] getAvailableLocales() {
+        return locales;
+    }
+}
+
--- a/test/jdk/sun/security/krb5/auto/KdcPolicy.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/test/jdk/sun/security/krb5/auto/KdcPolicy.java	Thu Mar 22 11:34:38 2018 -0700
@@ -100,9 +100,11 @@
         System.setProperty("java.security.krb5.conf", "alternative-krb5.conf");
 
         // Check default timeout is 30s. Use real KDC only, otherwise too
-        // slow to wait for timeout.
+        // slow to wait for timeout. Each request (without preauth and with
+        // preauth) might be retried 3 times, and could fail if one fails for
+        // all 3 times.
         writeConf(-1, -1, p3);
-        test("c30000c30000");
+        test("(c30000){2,6}|(c30000){3,6}-");
 
         // 1. Default policy is tryLast
         //Security.setProperty("krb5.kdc.bad.policy", "tryLast");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/MultipleDocLintOptionsTest.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,12 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8198552
+ * @summary Check that -Xdoclint: option can be specified multiple times
+ * @compile/fail/ref=MultipleDocLintOptionsTest.out -Xdoclint:html -Xdoclint:syntax -XDrawDiagnostics MultipleDocLintOptionsTest.java
+ */
+
+/** <html> */
+public class MultipleDocLintOptionsTest {
+    /** @return */
+    int emptyReturn() { return -1; }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/MultipleDocLintOptionsTest.out	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,5 @@
+MultipleDocLintOptionsTest.java:8:5: compiler.err.proc.messager: element not allowed in documentation comments: <html>
+MultipleDocLintOptionsTest.java:8:5: compiler.err.proc.messager: element not closed: html
+MultipleDocLintOptionsTest.java:10:9: compiler.warn.proc.messager: no description for @return
+2 errors
+1 warning
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/multipackage/MultiPackage.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8198552
+ * @summary Check that -Xdoclint/package: option can be specified multiple times
+ * @compile/fail/ref=MultiPackage.out -Xdoclint:html -Xdoclint/package:p1 -Xdoclint/package:p2 -XDrawDiagnostics p1/Test1.java p2/Test2.java
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/multipackage/MultiPackage.out	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,5 @@
+Test1.java:4:4: compiler.err.proc.messager: element not allowed in documentation comments: <html>
+Test1.java:4:4: compiler.err.proc.messager: element not closed: html
+Test2.java:4:4: compiler.err.proc.messager: element not allowed in documentation comments: <html>
+Test2.java:4:4: compiler.err.proc.messager: element not closed: html
+4 errors
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/multipackage/p1/Test1.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,5 @@
+/*/nodynamiccopyright/*/
+package p1;
+
+/**<html>*/
+public class Test1 {}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/doclint/multipackage/p2/Test2.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,5 @@
+/*/nodynamiccopyright/*/
+package p2;
+
+/**<html>*/
+public class Test2 {}
--- a/test/langtools/tools/javac/TryWithResources/TwrClose.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/test/langtools/tools/javac/TryWithResources/TwrClose.java	Thu Mar 22 11:34:38 2018 -0700
@@ -27,7 +27,6 @@
  * @summary Verify that the close resource code works properly in all cases
  * @library /tools/lib
  * @modules jdk.compiler/com.sun.tools.javac.api
- *          jdk.compiler/com.sun.tools.javac.comp
  *          jdk.compiler/com.sun.tools.javac.main
  * @build toolbox.ToolBox TwrClose
  * @run main TwrClose
@@ -37,15 +36,14 @@
 import javax.tools.StandardLocation;
 import javax.tools.ToolProvider;
 
-import com.sun.tools.javac.comp.Lower;
-
 import toolbox.JavacTask;
 import toolbox.ToolBox;
 
 public class TwrClose {
 
+    private static final int MAX_RESOURCES = 5;
     public static void main(String... args) throws Exception {
-        for (int i = 1; i < Lower.USE_CLOSE_RESOURCE_METHOD_THRESHOLD * 2; i++) {
+        for (int i = 1; i < MAX_RESOURCES * 2; i++) {
             new TwrClose().compile(i);
         }
     }
--- a/test/langtools/tools/javac/TryWithResources/TwrShareCloseCode.java	Thu Mar 22 11:09:50 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @bug 7020499
- * @summary Verify that the code that closes the resources is shared by among try-with-resources
- * @library /tools/lib
- * @modules jdk.compiler/com.sun.tools.javac.api
- *          jdk.compiler/com.sun.tools.javac.code
- *          jdk.compiler/com.sun.tools.javac.comp
- *          jdk.compiler/com.sun.tools.javac.tree
- *          jdk.compiler/com.sun.tools.javac.util
- * @build toolbox.ToolBox TwrShareCloseCode
- * @run main TwrShareCloseCode
- */
-
-import java.io.IOException;
-import java.util.Arrays;
-
-import com.sun.source.util.JavacTask;
-import com.sun.tools.javac.api.JavacTool;
-import com.sun.tools.javac.comp.AttrContext;
-import com.sun.tools.javac.comp.Env;
-import com.sun.tools.javac.comp.Lower;
-import com.sun.tools.javac.tree.JCTree;
-import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
-import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
-import com.sun.tools.javac.tree.TreeInfo;
-import com.sun.tools.javac.tree.TreeMaker;
-import com.sun.tools.javac.tree.TreeScanner;
-import com.sun.tools.javac.util.Context;
-import com.sun.tools.javac.util.Context.Factory;
-import com.sun.tools.javac.util.List;
-
-import toolbox.ToolBox;
-
-public class TwrShareCloseCode {
-    public static void main(String... args) throws IOException {
-        new TwrShareCloseCode().run();
-    }
-
-    void run() throws IOException {
-        run("try (Test t1 = new Test()) { }", true);
-        run("try (Test t1 = new Test()) { }\n" +
-            "try (Test t2 = new Test()) { }", true);
-        run("try (Test t1 = new Test();\n" +
-            "     Test t2 = new Test()) { }", true);
-        run("try (Test t1 = new Test()) { }\n" +
-            "try (Test t2 = new Test()) { }\n" +
-            "try (Test t3 = new Test()) { }", true);
-        run("try (Test t1 = new Test();\n" +
-            "     Test t2 = new Test();\n" +
-            "     Test t3 = new Test()) { }", false);
-        run("try (Test t1 = new Test()) { }\n" +
-            "try (Test t2 = new Test()) { }\n" +
-            "try (Test t3 = new Test()) { }\n" +
-            "try (Test t4 = new Test()) { }", false);
-
-        run("try (Test t1 = new Test()) { i++; }", true);
-        run("try (Test t1 = new Test()) { i++; }\n" +
-            "try (Test t2 = new Test()) { i++; }", false);
-
-        run("try (Test t1 = new Test(); Test t2 = new Test()) { i++; }", false);
-
-        run("try (Test t1 = new Test()) { i++; }\n" +
-            "try (Test t2 = new Test()) { }", true);
-
-        run("try (Test t1 = new Test()) { i++; }\n" +
-            "try (Test t2 = new Test()) { }\n" +
-            "try (Test t3 = new Test()) { }", false);
-
-        run("try (Test t1 = new Test()) { i++; }\n" +
-            "try (Test t2 = new Test()) { i++; }\n" +
-            "try (Test t3 = new Test()) { }", false);
-    }
-    void run(String trySpec, boolean expected) throws IOException {
-        String template = "public class Test implements AutoCloseable {\n" +
-                          "    void t(int i) {\n" +
-                          "        TRY\n" +
-                          "    }\n" +
-                          "    public void close() { }\n" +
-                          "}\n";
-        String code = template.replace("TRY", trySpec);
-        Context ctx = new Context();
-        DumpLower.preRegister(ctx);
-        Iterable<ToolBox.JavaSource> files = Arrays.asList(new ToolBox.JavaSource(code));
-        JavacTask task = JavacTool.create().getTask(null, null, null, null, null, files, ctx);
-        task.call();
-        boolean actual = ((DumpLower) DumpLower.instance(ctx)).closeSeen;
-
-        if (expected != actual) {
-            throw new IllegalStateException("expected: " + expected + "; actual: " + actual + "; code:\n" + code);
-        }
-    }
-
-    static class DumpLower extends Lower {
-
-        public static void preRegister(Context ctx) {
-            ctx.put(lowerKey, new Factory<Lower>() {
-                @Override
-                public Lower make(Context c) {
-                    return new DumpLower(c);
-                }
-            });
-        }
-
-        public DumpLower(Context context) {
-            super(context);
-        }
-
-        boolean closeSeen;
-
-        @Override
-        public List<JCTree> translateTopLevelClass(Env<AttrContext> env, JCTree cdef, TreeMaker make) {
-            List<JCTree> result = super.translateTopLevelClass(env, cdef, make);
-
-            new TreeScanner() {
-                @Override
-                public void visitMethodDef(JCMethodDecl tree) {
-                    if (!tree.name.contentEquals("t"))
-                        return;
-
-                    super.visitMethodDef(tree);
-                }
-
-                @Override
-                public void visitApply(JCMethodInvocation tree) {
-                    closeSeen |= TreeInfo.symbol(tree.meth).name.contentEquals("close");
-                    super.visitApply(tree);
-                }
-            }.scan(result);
-
-            return result;
-        }
-
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/TryWithResources/TwrSimpleClose.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8194978
+ * @summary Verify than an appropriate number of close method invocations is generated.
+ * @library /tools/lib
+ * @modules jdk.jdeps/com.sun.tools.classfile
+ * @build toolbox.ToolBox TwrSimpleClose
+ * @run main TwrSimpleClose
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.tools.FileObject;
+import javax.tools.ForwardingJavaFileManager;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.JavaFileObject.Kind;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.ToolProvider;
+
+import com.sun.source.util.JavacTask;
+import com.sun.tools.classfile.Attribute;
+import com.sun.tools.classfile.ClassFile;
+import com.sun.tools.classfile.Code_attribute;
+import com.sun.tools.classfile.ConstantPool.CONSTANT_Methodref_info;
+import com.sun.tools.classfile.ConstantPool.CONSTANT_NameAndType_info;
+import com.sun.tools.classfile.Instruction;
+import com.sun.tools.classfile.Method;
+import com.sun.tools.classfile.Opcode;
+
+import toolbox.ToolBox;
+
+public class TwrSimpleClose {
+
+    private final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+
+    public static void main(String... args) throws Exception {
+        new TwrSimpleClose().run();
+    }
+
+    void run() throws Exception {
+        run("try (Test t = new Test()) { System.err.println(0); }", 2);
+        run("try (Test t = new Test()) {\n" +
+            "    if (t.hashCode() == 42)\n" +
+            "        return;\n" +
+            "    System.err.println(0);\n" +
+            "}\n", 3);
+    }
+
+    void run(String trySpec, int expectedCloseCount) throws Exception {
+        String template = "public class Test implements AutoCloseable {\n" +
+                          "    void t(int i) {\n" +
+                          "        TRY\n" +
+                          "    }\n" +
+                          "    public void close() { }\n" +
+                          "}\n";
+        String code = template.replace("TRY", trySpec);
+        int closeCount = 0;
+
+        try (StandardJavaFileManager sfm = compiler.getStandardFileManager(null, null, null);
+             JFMImpl fm = new JFMImpl(sfm)) {
+            Iterable<ToolBox.JavaSource> files = Arrays.asList(new ToolBox.JavaSource(code));
+            JavacTask task = (JavacTask) compiler.getTask(null, fm, null, null, null, files);
+            task.call();
+
+            if (fm.classBytes.size() != 1) {
+                throw new AssertionError();
+            }
+
+            byte[] data = fm.classBytes.values().iterator().next();
+            ClassFile cf = ClassFile.read(new ByteArrayInputStream(data));
+
+            for (Method m : cf.methods) {
+                Code_attribute codeAttr = (Code_attribute) m.attributes.map.get(Attribute.Code);
+                for (Instruction i : codeAttr.getInstructions()) {
+                    if (i.getOpcode() == Opcode.INVOKEVIRTUAL) {
+                        CONSTANT_Methodref_info method =
+                                (CONSTANT_Methodref_info) cf.constant_pool.get(i.getShort(1));
+                        CONSTANT_NameAndType_info nameAndType =
+                                cf.constant_pool.getNameAndTypeInfo(method.name_and_type_index);
+                        if ("close".equals(nameAndType.getName())) {
+                            closeCount++;
+                        }
+                    }
+                }
+            }
+            if (expectedCloseCount != closeCount) {
+                throw new IllegalStateException("expected close count: " + expectedCloseCount +
+                                                "; actual: " + closeCount + "; code:\n" + code);
+            }
+        }
+    }
+
+    private static final class JFMImpl extends ForwardingJavaFileManager<JavaFileManager> {
+
+        private final Map<String, byte[]> classBytes = new HashMap<>();
+
+        public JFMImpl(JavaFileManager fileManager) {
+            super(fileManager);
+        }
+
+        @Override
+        public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind,
+                                                   FileObject sibling) throws IOException {
+            try {
+                return new SimpleJavaFileObject(new URI("mem://" + className + ".class"), kind) {
+                    @Override
+                    public OutputStream openOutputStream() throws IOException {
+                        return new ByteArrayOutputStream() {
+                            @Override
+                            public void close() throws IOException {
+                                super.close();
+                                classBytes.put(className, toByteArray());
+                            }
+                        };
+                    }
+                };
+            } catch (URISyntaxException ex) {
+                throw new IOException(ex);
+            }
+        }
+    }
+
+}
--- a/test/langtools/tools/javac/annotations/typeAnnotations/referenceinfos/ResourceVariable.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/test/langtools/tools/javac/annotations/typeAnnotations/referenceinfos/ResourceVariable.java	Thu Mar 22 11:34:38 2018 -0700
@@ -36,9 +36,9 @@
 public class ResourceVariable {
 
     @TADescription(annotation = "TA", type = RESOURCE_VARIABLE,
-            lvarOffset = {10}, lvarLength = {106}, lvarIndex = {1})
+            lvarOffset = {10}, lvarLength = {37}, lvarIndex = {1})
     @TADescription(annotation = "TB", type = RESOURCE_VARIABLE,
-            lvarOffset = {22}, lvarLength = {31}, lvarIndex = {3})
+            lvarOffset = {20}, lvarLength = {4}, lvarIndex = {2})
     public String testResourceVariable() {
         return
                 "public void f() throws IOException {" + lineSeparator() +
@@ -49,7 +49,7 @@
     }
 
     @TADescription(annotation = "RTAs", type = RESOURCE_VARIABLE,
-            lvarOffset = {10}, lvarLength = {26}, lvarIndex = {1})
+            lvarOffset = {10}, lvarLength = {4}, lvarIndex = {1})
     public String testRepeatedAnnotation1() {
         return
                 "public void f() throws IOException {" + lineSeparator() +
@@ -58,7 +58,7 @@
     }
 
     @TADescription(annotation = "RTAs", type = RESOURCE_VARIABLE,
-            lvarOffset = {10}, lvarLength = {26}, lvarIndex = {1})
+            lvarOffset = {10}, lvarLength = {4}, lvarIndex = {1})
     public String testRepeatedAnnotation2() {
         return
                 "public void f() throws IOException {" + lineSeparator() +
@@ -67,9 +67,9 @@
     }
 
     @TADescription(annotation = "TA", type = RESOURCE_VARIABLE,
-            lvarOffset = {10}, lvarLength = {106}, lvarIndex = {1})
+            lvarOffset = {10}, lvarLength = {37}, lvarIndex = {1})
     @TADescription(annotation = "TB", type = RESOURCE_VARIABLE,
-            lvarOffset = {22}, lvarLength = {31}, lvarIndex = {3})
+            lvarOffset = {20}, lvarLength = {4}, lvarIndex = {2})
     public String testSeveralVariablesInTryWithResources() {
         return
                 "public void f() throws IOException {" + lineSeparator() +
--- a/test/langtools/tools/javac/flow/tests/TestCaseTry.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/test/langtools/tools/javac/flow/tests/TestCaseTry.java	Thu Mar 22 11:34:38 2018 -0700
@@ -52,9 +52,9 @@
         o = "";
     }
 
-    @AliveRange(varName="o", bytecodeStart=22, bytecodeLength=13)
-    @AliveRange(varName="o", bytecodeStart=53, bytecodeLength=3)
-    @AliveRange(varName="o", bytecodeStart=60, bytecodeLength=1)
+    @AliveRange(varName="o", bytecodeStart=20, bytecodeLength=12)
+    @AliveRange(varName="o", bytecodeStart=50, bytecodeLength=3)
+    @AliveRange(varName="o", bytecodeStart=57, bytecodeLength=1)
     void m3() {
         Object o;
         try (BufferedReader br =
@@ -65,8 +65,8 @@
         o = "";
     }
 
-    @AliveRange(varName="o", bytecodeStart=12, bytecodeLength=46)
-    @AliveRange(varName="o", bytecodeStart=62, bytecodeLength=1)
+    @AliveRange(varName="o", bytecodeStart=12, bytecodeLength=43)
+    @AliveRange(varName="o", bytecodeStart=59, bytecodeLength=1)
     void m4() {
         String o;
         try (BufferedReader br =
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/plugin/MultiplePlugins.java	Thu Mar 22 11:34:38 2018 -0700
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ *  @test
+ *  @bug 8198552
+ *  @summary Check that multiple plugins can be specified when starting javac
+ *  @library /tools/lib
+ *  @modules jdk.compiler/com.sun.tools.javac.api
+ *           jdk.compiler/com.sun.tools.javac.main
+ *           jdk.jdeps/com.sun.tools.javap
+ *  @build toolbox.ToolBox toolbox.JavacTask toolbox.JarTask
+ *  @run main MultiplePlugins
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.tools.JavaCompiler;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.StandardLocation;
+import javax.tools.ToolProvider;
+
+import toolbox.JarTask;
+import toolbox.JavacTask;
+import toolbox.Task;
+import toolbox.ToolBox;
+
+public class MultiplePlugins {
+    public static void main(String... args) throws Exception {
+        new MultiplePlugins().run();
+    }
+
+    final File pluginClasses;
+    final File pluginModuleClasses;
+    final File pluginJar;
+    final JavaCompiler compiler;
+    final ToolBox tb = new ToolBox();
+
+    MultiplePlugins() throws Exception {
+        pluginClasses = new File("plugin");
+        tb.createDirectories(pluginClasses.toPath());
+        pluginModuleClasses = new File("plugin-modules");
+        pluginJar = new File("plugin.jar");
+        compiler = ToolProvider.getSystemJavaCompiler();
+    }
+
+    void run() throws Exception {
+        // compile the plugins:
+        new JavacTask(tb)
+          .options("-d", pluginClasses.getPath())
+          .sources(PLUGIN1, PLUGIN2)
+          .run();
+
+        File plugin = new File(pluginClasses.getPath(), "META-INF/services/com.sun.source.util.Plugin");
+        tb.writeFile(plugin.getPath(), "p1.Plugin1\np2.Plugin2\n");
+        new JarTask(tb)
+          .run("cf", pluginJar.getPath(), "-C", pluginClasses.getPath(), ".");
+
+        testCommandLine(EXPECTED, "--processor-path", pluginJar.toString(), "-Xplugin:plugin1", "-Xplugin:plugin2");
+        testAPI(EXPECTED, "--processor-path", pluginJar.toString(), "-Xplugin:plugin1", "-Xplugin:plugin2");
+
+        // compile the plugins as modules:
+        File m1 = new File(pluginModuleClasses, "m1");
+        tb.createDirectories(m1.toPath());
+        new JavacTask(tb)
+          .options("-d", m1.getPath())
+          .sources(MODULE1, PLUGIN1)
+          .run();
+
+        File m2 = new File(pluginModuleClasses, "m2");
+        tb.createDirectories(m2.toPath());
+        new JavacTask(tb)
+          .options("-d", m2.getPath())
+          .sources(MODULE2, PLUGIN2)
+          .run();
+
+        testCommandLine(EXPECTED, "--processor-module-path", pluginModuleClasses.toString(), "-Xplugin:plugin1", "-Xplugin:plugin2");
+        testAPI(EXPECTED, "--processor-module-path", pluginModuleClasses.toString(), "-Xplugin:plugin1", "-Xplugin:plugin2");
+
+        if (errors > 0)
+            throw new Exception(errors + " errors occurred");
+    }
+
+    void testAPI(List<String> ref, String... opts) throws Exception {
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
+
+            System.err.println("test api: " + List.of(opts));
+            Task.Result result = new JavacTask(tb, Task.Mode.API)
+                                      .fileManager(fm)
+                                      .options(opts)
+                                      .sources(TEST)
+                                      .run(Task.Expect.SUCCESS)
+                                      .writeAll();
+            List<String> out = result.getOutputLines(Task.OutputKind.STDERR);
+            checkOutput(out, ref);
+        }
+    }
+
+    void testCommandLine(List<String> ref,String... opt) throws IOException {
+        Path testJavaFile = Paths.get("Test.java");
+
+        tb.writeFile(testJavaFile, TEST);
+
+        List<String> args = new ArrayList<>();
+
+        args.add("-d"); args.add(".");
+        args.addAll(List.of(opt));
+
+        System.err.println("test command line: " + Arrays.asList(args));
+        Task.Result result = new JavacTask(tb, Task.Mode.CMDLINE)
+                                  .options(args)
+                                  .files(testJavaFile)
+                                  .run(Task.Expect.SUCCESS)
+                                  .writeAll();
+        List<String> out = result.getOutputLines(Task.OutputKind.STDERR);
+        checkOutput(out, ref);
+    }
+
+    private void checkOutput(List<String> lines, List<String> ref) {
+        if (!lines.equals(ref)) {
+            error("unexpected output");
+        }
+    }
+
+    private void error(String msg) {
+        System.err.println(msg);
+        errors++;
+    }
+
+    int errors;
+
+    private static final String MODULE1 =
+            "module m1 {\n" +
+            "    requires jdk.compiler;\n" +
+            "    provides com.sun.source.util.Plugin with p1.Plugin1;\n" +
+            "}\n";
+    private static final String PLUGIN1 =
+            "package p1;\n" +
+            "import com.sun.source.util.*;\n" +
+            "public class Plugin1 implements Plugin {\n" +
+            "    public String getName() {\n" +
+            "        return \"plugin1\";\n" +
+            "    }\n" +
+            "    public void init(JavacTask task, String... args) {\n" +
+            "        System.err.println(\"plugin1\");\n" +
+            "    }\n" +
+            "}";
+    private static final String MODULE2 =
+            "module m2 {\n" +
+            "    requires jdk.compiler;\n" +
+            "    provides com.sun.source.util.Plugin with p2.Plugin2;\n" +
+            "}\n";
+    private static final String PLUGIN2 =
+            "package p2;\n" +
+            "import com.sun.source.util.*;\n" +
+            "public class Plugin2 implements Plugin {\n" +
+            "    public String getName() {\n" +
+            "        return \"plugin2\";\n" +
+            "    }\n" +
+            "    public void init(JavacTask task, String... args) {\n" +
+            "        System.err.println(\"plugin2\");\n" +
+            "    }\n" +
+            "}";
+    private static final String TEST =
+            "public class Test {}";
+    private static final List<String> EXPECTED = List.of(
+            "plugin1",
+            "plugin2"
+    );
+
+}
--- a/test/lib/jdk/test/lib/compiler/CompilerUtils.java	Thu Mar 22 11:09:50 2018 -0700
+++ b/test/lib/jdk/test/lib/compiler/CompilerUtils.java	Thu Mar 22 11:34:38 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. 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
@@ -47,8 +47,14 @@
      * {@code <destination>/**}. The destination directory will be created if
      * it doesn't exist.
      *
+     * Equivalent to calling {@code compile(source, destination, true, options);}.
+     *
      * All warnings/errors emitted by the compiler are output to System.out/err.
      *
+     * @param source Path to the source directory
+     * @param destination Path to the destination directory
+     * @param options Any options to pass to the compiler
+     *
      * @return true if the compilation is successful
      *
      * @throws IOException
@@ -60,6 +66,36 @@
     public static boolean compile(Path source, Path destination, String... options)
         throws IOException
     {
+        return compile(source, destination, true, options);
+    }
+
+    /**
+     * Compile all the java sources in {@code <source>} and optionally its
+     * subdirectories, to
+     * {@code <destination>}. The destination directory will be created if
+     * it doesn't exist.
+     *
+     * All warnings/errors emitted by the compiler are output to System.out/err.
+     *
+     * @param source Path to the source directory
+     * @param destination Path to the destination directory
+     * @param recurse If {@code true} recurse into any {@code source} subdirectories
+     *        to compile all java source files; else only compile those directly in
+     *        {@code source}.
+     * @param options Any options to pass to the compiler
+     *
+     * @return true if the compilation is successful
+     *
+     * @throws IOException
+     *         if there is an I/O error scanning the source tree or
+     *         creating the destination directory
+     * @throws UnsupportedOperationException
+     *         if there is no system java compiler
+     */
+
+   public static boolean compile(Path source, Path destination, boolean recurse, String... options)
+        throws IOException
+    {
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
         if (compiler == null) {
             // no compiler available
@@ -69,7 +105,7 @@
         StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null);
 
         List<Path> sources
-            = Files.find(source, Integer.MAX_VALUE,
+            = Files.find(source, (recurse ? Integer.MAX_VALUE : 1),
                 (file, attrs) -> (file.toString().endsWith(".java")))
                 .collect(Collectors.toList());