@@ -157,6 +157,9 @@ def post_process_command_line_args(self, args):
157
157
return [arg if not callable (arg ) else arg () for arg in self .extra_args ] + args
158
158
159
159
def get_jdk (self ):
160
+ if self .run_on_java_home ():
161
+ # forcing the use of the default JAVA_HOME VM as runtime instead of the one pointed at by the tag
162
+ return mx .get_jdk ()
160
163
tag = mx .get_jdk_option ().tag
161
164
if tag and tag != JVMCI_JDK_TAG :
162
165
mx .abort ("The '{0}/{1}' VM requires '--jdk={2}'" .format (
@@ -254,7 +257,7 @@ def post_process_launcher_command_line_args(self, args):
254
257
args
255
258
256
259
def home (self ):
257
- if self .name () == 'native-image-java-home' :
260
+ if self .run_on_java_home () or self . name () == 'native-image-java-home' :
258
261
return mx .get_jdk ().home
259
262
return mx_sdk_vm_impl .graalvm_home (fatalIfMissing = True )
260
263
@@ -341,18 +344,24 @@ def __init__(self, vm: NativeImageVM, bm_suite: BenchmarkSuite | NativeImageBenc
341
344
self .skip_agent_assertions = bm_suite .skip_agent_assertions (self .benchmark_name , args )
342
345
current_stage = vm .stages_info .current_stage
343
346
is_shared_library = current_stage is not None and current_stage .is_layered () and current_stage .layer_info .is_shared_library
347
+ # base image name (used for auxiliary output files)
348
+ base_image_name = self .bm_suite .get_base_image_name (shared_library_layer_index = current_stage .layer_info .index if is_shared_library else None )
349
+ # full image name qualified with vm suffix (passed as -o argument to native-image)
350
+ self .final_image_name = self .bm_suite .get_full_image_name (base_image_name , vm .config_name ())
351
+ # root directory for all output. can be overridden with -Dnative-image.benchmark.benchmark-output-dir
344
352
self .benchmark_output_dir = self .bm_suite .benchmark_output_dir (self .benchmark_name , args )
345
- executable_name , output_dir = self .get_executable_name_and_output_dir_for_stage (current_stage , vm )
346
- self .executable_name : str = executable_name
347
- self .output_dir : Path = output_dir
348
- self .final_image_name = self .executable_name + '-' + vm .config_name ()
349
- self .profile_path : Path = self .output_dir / f"{ self .executable_name } .iprof"
350
- self .source_mappings_path : Path = self .output_dir / f"{ self .executable_name } .sourceMappings.json"
351
- self .perf_script_path : Path = self .output_dir / f"{ self .executable_name } .perf.script.out"
352
- self .perf_data_path : Path = self .output_dir / f"{ self .executable_name } .perf.data"
353
+ # specific directory with output for this image build.
354
+ self .output_dir : Path = self .bm_suite .get_image_output_dir (self .benchmark_output_dir , self .final_image_name )
355
+ # path of the final executable.
356
+ self .image_path : Path = self .output_dir / self .bm_suite .get_image_file_name (self .final_image_name , shared_library = is_shared_library )
357
+ self .instrumented_image_path = self .output_dir / self .bm_suite .get_image_file_name (f"{ base_image_name } -instrument" )
358
+ self .profile_path : Path = self .output_dir / f"{ base_image_name } .iprof"
359
+ self .source_mappings_path : Path = self .output_dir / f"{ base_image_name } .sourceMappings.json"
360
+ self .perf_script_path : Path = self .output_dir / f"{ base_image_name } .perf.script.out"
361
+ self .perf_data_path : Path = self .output_dir / f"{ base_image_name } .perf.data"
353
362
self .config_dir : Path = self .output_dir / "config"
354
363
self .log_dir : Path = self .output_dir
355
- self .ml_log_dump_path : Path = self .output_dir / f"{ self . executable_name } .ml.log.csv"
364
+ self .ml_log_dump_path : Path = self .output_dir / f"{ base_image_name } .ml.log.csv"
356
365
base_image_build_args = ['--no-fallback' ]
357
366
if not vm .pgo_use_perf :
358
367
# Can only have debug info when not using perf, [GR-66850]
@@ -405,13 +414,6 @@ def __init__(self, vm: NativeImageVM, bm_suite: BenchmarkSuite | NativeImageBenc
405
414
406
415
self .image_build_reports_directory : Path = self .output_dir / "reports"
407
416
408
- # Path of the final executable
409
- self .image_path = self .output_dir / self .final_image_name
410
- self .instrumented_image_path = self .output_dir / f"{ self .executable_name } -instrument"
411
- if is_shared_library :
412
- self .image_path = self .image_path .parent / f"{ self .image_path .name } .so"
413
- self .instrumented_image_path = self .instrumented_image_path .parent / f"{ self .instrumented_image_path .name } .so"
414
-
415
417
if vm .is_quickbuild :
416
418
base_image_build_args += ['-Ob' ]
417
419
if vm .graalos or vm .graalhost_graalos :
@@ -465,33 +467,6 @@ def build_report_args(self, is_gate: bool, graalvm_edition: str):
465
467
# Generate Build Report only when the benchmark is a part of EE gate.
466
468
return ['--emit=build-report' ] if is_gate and graalvm_edition == "ee" else []
467
469
468
- def get_executable_name_and_output_dir_for_stage (self , stage : Stage , vm : NativeImageVM ) -> Tuple [str , Path ]:
469
- executable_name = self .compute_executable_name ()
470
- is_shared_library = stage is not None and stage .is_layered () and stage .layer_info .is_shared_library
471
- if is_shared_library :
472
- # Shared library layers have to start with 'lib' and are differentiated with the layer index
473
- executable_name = f"lib-layer{ stage .layer_info .index } -{ executable_name } "
474
-
475
- # Form output directory
476
- root_dir = Path (
477
- self .benchmark_output_dir if self .benchmark_output_dir else mx .suite ('sdk' ).get_output_root (platformDependent = False ,
478
- jdkDependent = False )).absolute ()
479
- output_dir = root_dir / "native-image-benchmarks" / f"{ executable_name } -{ vm .config_name ()} "
480
-
481
- return executable_name , output_dir
482
-
483
- def compute_executable_name (self ) -> str :
484
- result = self .bm_suite .executable_name ()
485
- if result is not None :
486
- return result
487
-
488
- parts = [self .bm_suite .benchSuiteName ()]
489
- if self .bm_suite .version () != "unknown" :
490
- parts .append (self .bm_suite .version ().replace ("." , "-" ))
491
- if self .benchmark_name :
492
- parts .append (self .benchmark_name .replace (os .sep , "_" ))
493
- return "-" .join (parts ).lower ()
494
-
495
470
def get_build_output_json_file (self , stage : StageName ) -> Path :
496
471
"""
497
472
Path to the build output statistics JSON file (see also ``-H:BuildOutputJSONFile``).
@@ -1638,7 +1613,10 @@ def get_layer_aware_build_args(self) -> List[str]:
1638
1613
mx .abort ("Failed to find any shared library layer image stages!" )
1639
1614
layer_output_dirs = []
1640
1615
for stage in shared_library_stages :
1641
- _ , stage_output_dir = self .config .get_executable_name_and_output_dir_for_stage (stage , self )
1616
+ assert isinstance (self .bmSuite , NativeImageBenchmarkMixin )
1617
+ layer_base_image_name = self .bmSuite .get_base_image_name (shared_library_layer_index = stage .layer_info .index )
1618
+ layer_full_image_name = self .bmSuite .get_full_image_name (layer_base_image_name , self .config_name ())
1619
+ stage_output_dir = self .bmSuite .get_image_output_dir (self .config .benchmark_output_dir , layer_full_image_name )
1642
1620
layer_output_dirs .append (stage_output_dir .absolute ().as_posix ())
1643
1621
linker_r_path = "," .join (layer_output_dirs )
1644
1622
app_layer_build_args = [f"-H:LinkerRPath={ linker_r_path } " ]
@@ -1845,9 +1823,29 @@ def _layerize_stages(self, bm_suite, bm_suite_args, stages: List[Stage]) -> List
1845
1823
return layered_stages
1846
1824
1847
1825
1848
- # Adds JAVA_HOME VMs so benchmarks can run on GraalVM binaries without building them first.
1849
- for java_home_config in ['default' , 'pgo' , 'g1gc' , 'g1gc-pgo' , 'upx' , 'upx-g1gc' , 'quickbuild' , 'quickbuild-g1gc' ]:
1850
- mx_benchmark .add_java_vm (NativeImageVM ('native-image-java-home' , java_home_config ), _suite , 5 )
1826
+ def register_graalvm_vms ():
1827
+ # a simple JVM config that runs without any custom flag
1828
+ mx_benchmark .add_java_vm (JvmciJdkVm ('server' , 'vanilla' , []), _suite , 2 )
1829
+
1830
+ for java_home_config in ['default' , 'pgo' , 'g1gc' , 'g1gc-pgo' , 'upx' , 'upx-g1gc' , 'quickbuild' , 'quickbuild-g1gc' ]:
1831
+ mx_benchmark .add_java_vm (NativeImageVM ('native-image-java-home' , java_home_config ), _suite )
1832
+
1833
+ optimization_levels = ['O0' , 'O1' , 'O2' , 'O3' , 'Os' ]
1834
+ analysis_context_sensitivity = ['insens' , 'allocsens' , '1obj' , '2obj1h' , '3obj2h' , '4obj3h' ]
1835
+
1836
+ for short_name , config_suffix in [(None , '' ), ('niee' , '-ee' ), ('ni' , '-ce' )]:
1837
+ if short_name is None or any (component .short_name == short_name for component in mx_sdk_vm_impl .registered_graalvm_components (stage1 = False )):
1838
+ config_names = list ()
1839
+ for main_config in ['default' , 'gate' , 'llvm' , 'native-architecture' , 'future-defaults-all' , 'preserve-all' , 'preserve-classpath' ] + analysis_context_sensitivity + (['g1gc' , 'pgo' , 'g1gc-pgo' ] if config_suffix != '-ce' else []):
1840
+ config_names .append (f'{ main_config } { config_suffix } ' )
1841
+
1842
+ for optimization_level in optimization_levels :
1843
+ config_names .append (f'{ optimization_level } { config_suffix } ' )
1844
+ for main_config in ['llvm' , 'native-architecture' , 'g1gc' , 'native-architecture-g1gc' , 'preserve-all' , 'preserve-classpath' ] + analysis_context_sensitivity :
1845
+ config_names .append (f'{ main_config } -{ optimization_level } { config_suffix } ' )
1846
+
1847
+ for config_name in config_names :
1848
+ mx_benchmark .add_java_vm (NativeImageVM ('native-image' , config_name , ['--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED' ]), _suite , 10 )
1851
1849
1852
1850
1853
1851
class ObjdumpSectionRule (mx_benchmark .StdOutRule ):
@@ -4196,7 +4194,7 @@ def benchmark_output_dir(self, _, args):
4196
4194
if parsed_args :
4197
4195
return parsed_args [0 ]
4198
4196
else :
4199
- return None
4197
+ return mx . suite ( 'sdk' ). get_output_root ( platformDependent = False , jdkDependent = False )
4200
4198
4201
4199
def filter_stages_with_cli_requested_stages (self , bm_suite_args : List [str ], stages : List [Stage ]) -> List [Stage ]:
4202
4200
"""
@@ -4252,9 +4250,47 @@ def get_stage_env(self) -> Optional[dict]:
4252
4250
"""Return the environment to be used when executing a stage."""
4253
4251
return None
4254
4252
4255
- def executable_name (self ) -> Optional [str ]:
4256
- """Override to allow suites to control the executable name used in image builds."""
4257
- return None
4253
+ def _base_image_name (self : BenchmarkSuite | NativeImageBenchmarkMixin ) -> str :
4254
+ """
4255
+ Returns the name to use in image builds. May be overridden.
4256
+ Note that this name is not necessarily the full image name (there may be prefixes/suffixes added).
4257
+ Use `get_image_path` to obtain the final image path.
4258
+ """
4259
+ parts = [self .benchSuiteName ()]
4260
+ if self .version () != "unknown" :
4261
+ parts .append (self .version ().replace ("." , "-" ))
4262
+ parts .append (self .benchmarkName ())
4263
+ return "-" .join (parts ).lower ()
4264
+
4265
+ def get_base_image_name (self , shared_library_layer_index : Optional [int ] = None ) -> str :
4266
+ """
4267
+ Returns the base image name to use for auxiliary build files (e.g., iprof files).
4268
+ """
4269
+ base_image_name = self ._base_image_name ()
4270
+ if shared_library_layer_index is not None :
4271
+ # Shared library layers have to start with 'lib' and are differentiated with the layer index
4272
+ base_image_name = f"lib-layer{ shared_library_layer_index } -{ base_image_name } "
4273
+ return base_image_name
4274
+
4275
+ def get_full_image_name (self , base_image_name : str , vm_config : str ) -> str :
4276
+ """
4277
+ Returns the base image name qualified by the vm suffix. This name is passed as the -o argument to native-image.
4278
+ """
4279
+ return f"{ base_image_name } -{ vm_config } "
4280
+
4281
+ def get_image_file_name (self , full_image_name : str , shared_library : bool = False ) -> str :
4282
+ """
4283
+ Returns the file name of the generated image.
4284
+ """
4285
+ if shared_library :
4286
+ return f"{ full_image_name } .so"
4287
+ return full_image_name
4288
+
4289
+ def get_image_output_dir (self , benchmark_output_dir : str , full_image_name : str ) -> Path :
4290
+ """
4291
+ Returns the output directory for the given image name, as a subdirectory of the root output directory.
4292
+ """
4293
+ return Path (benchmark_output_dir ).absolute () / "native-image-benchmarks" / full_image_name
4258
4294
4259
4295
4260
4296
def measureTimeToFirstResponse (bmSuite ):
0 commit comments