Skip to content

Commit

Permalink
[GR-37609] Fix class initialization and object instantiation tracing …
Browse files Browse the repository at this point in the history
…options.

PullRequest: graal/11409
  • Loading branch information
Aleksandar Gradinac committed Mar 25, 2022
2 parents d5d17ad + 428023e commit 039edd0
Showing 1 changed file with 22 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1109,16 +1109,22 @@ private static String getLocationAgnosticArgPrefix(String argPrefix) {
}

protected static String getHostedOptionFinalArgumentValue(List<String> args, String argPrefix) {
List<String> values = getHostedOptionArgumentValues(args, argPrefix);
return values.isEmpty() ? null : values.get(values.size() - 1);
}

protected static List<String> getHostedOptionArgumentValues(List<String> args, String argPrefix) {
ArrayList<String> values = new ArrayList<>();
String locationAgnosticArgPrefix = getLocationAgnosticArgPrefix(argPrefix);
Pattern pattern = Pattern.compile(locationAgnosticArgPrefix);
String lastArg = null;

for (String arg : args) {
Matcher matcher = pattern.matcher(arg);
if (matcher.find()) {
lastArg = arg.substring(matcher.group().length());
values.add(arg.substring(matcher.group().length()));
}
}
return lastArg;
return values;
}

private boolean shouldAddCWDToCP() {
Expand All @@ -1136,38 +1142,19 @@ private boolean shouldAddCWDToCP() {
return customImageClasspath.isEmpty() && imageModulePath.isEmpty();
}

private static boolean isListArgumentSet(Collection<String> list, String argPrefix) {
return list.stream().anyMatch(arg -> arg.startsWith(argPrefix) && !arg.equals(argPrefix));
}

private boolean isListArgumentSet(String argPrefix) {
return isListArgumentSet(imageBuilderArgs, argPrefix);
}

private static String getListArgumentValue(Collection<String> list, String argPrefix) {
VMError.guarantee(isListArgumentSet(list, argPrefix));
return list.stream().filter(arg -> arg.startsWith(argPrefix)).map(arg -> arg.substring(argPrefix.length())).collect(Collectors.joining());
}

private String getListArgumentValue(String argPrefix) {
return getListArgumentValue(imageBuilderArgs, argPrefix);
}

private List<String> getAgentArguments() {
List<String> args = new ArrayList<>();
String agentOptions = "";
boolean shouldTraceClassInitialization = isListArgumentSet(oHTraceClassInitialization);
boolean shouldTraceObjectInstantiation = isListArgumentSet(oHTraceObjectInstantiation);
if (shouldTraceClassInitialization) {
String classesToTrace = getListArgumentValue(oHTraceClassInitialization);
agentOptions = getAgentOptions(classesToTrace, "c");
}
if (shouldTraceObjectInstantiation) {
String objectsToTrace = getListArgumentValue(oHTraceObjectInstantiation);
List<String> traceClassInitializationOpts = getHostedOptionArgumentValues(imageBuilderArgs, oHTraceClassInitialization);
List<String> traceObjectInstantiationOpts = getHostedOptionArgumentValues(imageBuilderArgs, oHTraceObjectInstantiation);
if (!traceClassInitializationOpts.isEmpty()) {
agentOptions = getAgentOptions(traceClassInitializationOpts, "c");
}
if (!traceObjectInstantiationOpts.isEmpty()) {
if (!agentOptions.isEmpty()) {
agentOptions += ",";
}
agentOptions += getAgentOptions(objectsToTrace, "o");
agentOptions += getAgentOptions(traceObjectInstantiationOpts, "o");
}

if (!agentOptions.isEmpty()) {
Expand All @@ -1177,8 +1164,8 @@ private List<String> getAgentArguments() {
return args;
}

private static String getAgentOptions(String options, String optionName) {
return Arrays.stream(options.split(",")).map(option -> optionName + "=" + option).collect(Collectors.joining(","));
private static String getAgentOptions(List<String> options, String optionName) {
return options.stream().flatMap(optValue -> Arrays.stream(optValue.split(","))).map(clazz -> optionName + "=" + clazz).collect(Collectors.joining(","));
}

private String targetPlatform = null;
Expand All @@ -1191,12 +1178,11 @@ private void addTargetArguments() {
* process (see comments for NativeImageGenerator.getTargetPlatform), we are parsing the
* --target argument here, and generating required internal arguments.
*/

if (!isListArgumentSet(oHTargetPlatform)) {
targetPlatform = getHostedOptionFinalArgumentValue(imageBuilderArgs, oHTargetPlatform);
if (targetPlatform == null) {
return;
}

targetPlatform = getListArgumentValue(oHTargetPlatform).toLowerCase();
targetPlatform = targetPlatform.toLowerCase();

String[] parts = targetPlatform.split("-");
if (parts.length != 2) {
Expand All @@ -1206,7 +1192,7 @@ private void addTargetArguments() {
targetOS = parts[0];
targetArch = parts[1];

if (isListArgumentSet(customJavaArgs, "-D" + Platform.PLATFORM_PROPERTY_NAME)) {
if (customJavaArgs.stream().anyMatch(arg -> arg.startsWith("-D" + Platform.PLATFORM_PROPERTY_NAME + "="))) {
NativeImage.showWarning("Usage of -D" + Platform.PLATFORM_PROPERTY_NAME + " might conflict with --target parameter.");
}

Expand Down

0 comments on commit 039edd0

Please sign in to comment.