|  | /* Copyright (C) 2021-2024 Free Software Foundation, Inc. | 
|  | Contributed by Oracle. | 
|  |  | 
|  | This file is part of GNU Binutils. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3, or (at your option) | 
|  | any later version. | 
|  |  | 
|  | This program 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 for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program; if not, write to the Free Software | 
|  | Foundation, 51 Franklin Street - Fifth Floor, Boston, | 
|  | MA 02110-1301, USA.  */ | 
|  |  | 
|  | import java.util.*; | 
|  | import java.io.*; | 
|  | import java.text.*; | 
|  |  | 
|  | class jsynprog | 
|  | { | 
|  | private static String	dir_home; | 
|  | private static PrintWriter	log; | 
|  | private static double 	pstart, cstart; | 
|  |  | 
|  | /* JNI calls */ | 
|  | public  static native double Timer(); | 
|  | private static native double cTimer(); | 
|  | private static native double computeSet(); | 
|  | private static native int JavaJavaC(int np, int scale); | 
|  | private static native void JavaCC(int scale); | 
|  | private static native void JavaCJava(int scale); | 
|  | private static native int isJVMPI(); | 
|  |  | 
|  | public static double testtime = 3.0 * 1e9; | 
|  |  | 
|  | public static void main (String [] args) | 
|  | { | 
|  | jsynprog jsyn_obj = new jsynprog(); | 
|  | Integer ni; | 
|  | int scale = 1000; | 
|  | String commands = "memalloc.add_int.add_double.has_inner_class" + | 
|  | ".recurse.recursedeep.bounce.array_op.vector_op.sys_op" + | 
|  | ".jni_JavaJavaC.JavaCC.JavaCJava.Launcher"; | 
|  |  | 
|  | createAcct(); | 
|  | LoadJNILibrary(args); | 
|  | testtime = computeSet(); | 
|  |  | 
|  | /* check for invocation parameter */ | 
|  | for (int i = 0; i < args.length; i++) { | 
|  | if (args[i].equals("-fast")) { | 
|  | scale = 10000; | 
|  | } else if (args[i].equals("-slow")) { | 
|  | scale = 1; | 
|  | } else if (args[i].equals("-j") && i + 1 < args.length) { | 
|  | commands = args[++i]; | 
|  | } else { | 
|  | System.err.println("fatal: unexpected argument: " + args[0] ); | 
|  | System.exit(1); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* large memory allocations, trigger gc */ | 
|  | Routine rtn = new Routine(); | 
|  | Sub_Routine sbrt = new Sub_Routine(); | 
|  |  | 
|  | if (commands.indexOf("memalloc") >= 0) { | 
|  | recTime(); | 
|  | rtn.memalloc(10000, scale); | 
|  | printValue("Routine.memalloc", false); | 
|  | } | 
|  |  | 
|  | /* add integers */ | 
|  | if (commands.indexOf("add_int") >= 0) { | 
|  | recTime(); | 
|  | ni = new Integer (rtn.add_int(scale)); | 
|  | printValue("Routine.add_int", true); | 
|  | } | 
|  |  | 
|  | /* add double */ | 
|  | if (commands.indexOf("add_double") >= 0) { | 
|  | recTime(); | 
|  | Double nd = new Double(rtn.add_double(scale)); | 
|  | printValue("Routine.add_double", true); | 
|  | } | 
|  |  | 
|  | /* call method in derived class */ | 
|  | if (commands.indexOf("add_int") >= 0) { | 
|  | recTime(); | 
|  | ni = new Integer (sbrt.add_int(scale)); | 
|  | printValue("Sub_Routine.add_int", true); | 
|  | } | 
|  |  | 
|  | /* call method that defines an inner class */ | 
|  | if (commands.indexOf("has_inner_class") >= 0) { | 
|  | recTime(); | 
|  | Integer[] na = rtn.has_inner_class(scale); | 
|  | printValue("Routine.has_inner_class", true); | 
|  | } | 
|  |  | 
|  | /* recursion */ | 
|  | if (commands.indexOf("recurse") >= 0) { | 
|  | recTime(); | 
|  | rtn.recurse(0,80, scale); | 
|  | printValue("Routine.recurse", true); | 
|  | } | 
|  |  | 
|  | /* deep recursion */ | 
|  | if (commands.indexOf("recursedeep") >= 0) { | 
|  | recTime(); | 
|  | rtn.recursedeep(0,500, scale); | 
|  | printValue("<Truncated-stack>", true); | 
|  | } | 
|  |  | 
|  | /* indirect recursion */ | 
|  | if (commands.indexOf("bounce") >= 0) { | 
|  | recTime(); | 
|  | rtn.bounce(0,20, scale); | 
|  | printValue("Routine.bounce", true); | 
|  | } | 
|  |  | 
|  | /* array operations */ | 
|  | if (commands.indexOf("array_op") >= 0) { | 
|  | recTime(); | 
|  | rtn.array_op(scale); | 
|  | printValue("Routine.array_op", false); | 
|  | } | 
|  |  | 
|  | /* Vector operations */ | 
|  | if (commands.indexOf("vector_op") >= 0) { | 
|  | recTime(); | 
|  | rtn.vector_op(scale); | 
|  | printValue("Routine.vector_op", false); | 
|  | } | 
|  |  | 
|  | /* spend time in system calls */ | 
|  | if (commands.indexOf("sys_op") >= 0) { | 
|  | recTime(); | 
|  | rtn.sys_op(scale); | 
|  | printValue("Routine.sys_op", false); | 
|  | } | 
|  |  | 
|  | /* java->java->c */ | 
|  | if (commands.indexOf("jni_JavaJavaC") >= 0) { | 
|  | recTime(); | 
|  | int np = 0; | 
|  | jni_JavaJavaC(np, scale); | 
|  | printValue("jsynprog.jni_JavaJavaC", true); | 
|  | } | 
|  |  | 
|  | /* java->c->c */ | 
|  | if (commands.indexOf("JavaCC") >= 0) { | 
|  | recTime(); | 
|  | JavaCC(scale); | 
|  | printValue("jsynprog.JavaCC", true); | 
|  | } | 
|  |  | 
|  | /* java->c->java */ | 
|  | if (commands.indexOf("JavaCJava") >= 0) { | 
|  | recTime(); | 
|  | JavaCJava(scale); | 
|  | printValue("jsynprog.JavaCJava", true); | 
|  | } | 
|  |  | 
|  |  | 
|  | /* dynamically loaded classes */ | 
|  | if (commands.indexOf("Launcher") >= 0) { | 
|  | String java_ver = System.getProperty("java.version"); | 
|  | Launcher lnch = new Launcher(); | 
|  | String[] params = new String[]{"DynLoadedClass"}; | 
|  | recTime(); | 
|  | lnch.main(params); | 
|  | printValue("Launcher.main", true); | 
|  | } | 
|  |  | 
|  | System.gc(); | 
|  | } | 
|  |  | 
|  | /* | 
|  | ** Create accounting file | 
|  | */ | 
|  | private static void createAcct() { | 
|  | System.out.println ("Directing output to acct file..."); | 
|  | try { | 
|  | log = new PrintWriter (new FileWriter("jsynprog.acct"), true); | 
|  | } catch (IOException ioe) { | 
|  | ioe.printStackTrace(); | 
|  | System.err.println("fatal: Cannot create accounting file "); | 
|  | System.exit(1); | 
|  | } | 
|  |  | 
|  | log.println("X\tLWPTime\tCPUTime\tFunction"); | 
|  | } | 
|  |  | 
|  | /* | 
|  | ** Print output in acct file | 
|  | */ | 
|  | private static void printValue (String fname, boolean noignore) { | 
|  | double	p_end = Timer();	 // Global.Timer(); | 
|  | double	c_end = cTimer();	// Global.cTimer(); | 
|  | double	prog_elapsed = p_end - pstart; | 
|  | double	cpu_elapsed = c_end - cstart; | 
|  | DecimalFormat     format_decimal = new DecimalFormat("0.000"); | 
|  |  | 
|  | System.out.println("Running " + fname + "; T = " + format_decimal.format(prog_elapsed * 0.000000001) | 
|  | +" UCPU = " + format_decimal.format(cpu_elapsed * 0.000000001)); | 
|  | log.print( (noignore == true?  "X" : "Y") | 
|  | + "\t" + format_decimal.format(prog_elapsed * 0.000000001) + "\t" | 
|  | + format_decimal.format(cpu_elapsed * 0.000000001) + "\t"); | 
|  | log.println(fname); | 
|  | } | 
|  |  | 
|  | /* | 
|  | ** Record intial times | 
|  | */ | 
|  | private static void recTime() { | 
|  | pstart = Timer();	 // Global.Timer(); | 
|  | cstart = cTimer();	// Global.cTimer(); | 
|  | } | 
|  |  | 
|  | /* | 
|  | ** Load dynamic shared library for JNI | 
|  | */ | 
|  | private static void LoadJNILibrary(String[] args) { | 
|  |  | 
|  | try { | 
|  | dir_home = (new File(".")).getCanonicalPath(); | 
|  | } catch (IOException e) { | 
|  | dir_home = ".."; | 
|  | } | 
|  | System.out.println("libpath:"+dir_home); | 
|  |  | 
|  | // Find which JVM was invoked | 
|  | String jvm_format = System.getProperty("java.vm.name"); | 
|  | System.out.println("jvm "+ jvm_format); | 
|  |  | 
|  | try { | 
|  | System.out.println("Loading library.... " + dir_home + "/libcloop.so"); | 
|  | System.load(dir_home + "/libcloop.so"); | 
|  | } catch (UnsatisfiedLinkError e) { | 
|  | System.err.println("fatal: Cannot load shared library " + e); | 
|  | System.exit(1); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* | 
|  | ** Makes a lot of JNI calls | 
|  | */ | 
|  | private static void jni_JavaJavaC(int np, int scale) { | 
|  | int ret = 0; | 
|  | int jmax = 10000; | 
|  | System.out.println("Entering jni_JavaJavaC, scale = " + scale); | 
|  | double tEnd = Timer() + testtime; | 
|  | do { | 
|  | for (int j =0 ; j<jmax; j++) { | 
|  | ret = JavaJavaC(np, scale); | 
|  | } | 
|  | } while (Timer() < tEnd); | 
|  | } | 
|  |  | 
|  | public static int javafunc (int scale) { | 
|  | int jmax = 200*scale; | 
|  | int imax = 40; | 
|  | int np = 0; | 
|  | // System.out.println("Entering javafunc, scale = " + scale); | 
|  | double tEnd = Timer() + testtime; | 
|  | do { np = 0; | 
|  | for (int j =0 ; j<jmax; j++) { | 
|  | for (int i =0 ; i<imax; i++) { | 
|  | np = (i%2==0)?np:(np + 1); | 
|  | } | 
|  | } | 
|  | } while (Timer() < tEnd); | 
|  | return np; | 
|  | } | 
|  | } |