8154473: Update for CompilerDirectives to control stub generation and intrinsics

Use -XX:DisableIntrinsic flag to control intrinsics usage in Interpreter.

Reviewed-by: twisti, neliasso, kvn, simonis
This commit is contained in:
Vivek Deshpande 2016-05-20 14:17:55 -07:00
parent 6dfcf1dd81
commit 489b38091e
9 changed files with 144 additions and 298 deletions

View file

@ -24,6 +24,7 @@
#include "precompiled.hpp"
#include "classfile/vmSymbols.hpp"
#include "compiler/compilerDirectives.hpp"
#include "memory/oopFactory.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/handles.inline.hpp"
@ -418,9 +419,43 @@ int vmIntrinsics::predicates_needed(vmIntrinsics::ID id) {
}
}
bool vmIntrinsics::is_intrinsic_available(vmIntrinsics::ID id) {
return !vmIntrinsics::is_intrinsic_disabled(id) &&
!vmIntrinsics::is_disabled_by_flags(id);
}
bool vmIntrinsics::is_intrinsic_disabled(vmIntrinsics::ID id) {
assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
// Canonicalize DisableIntrinsic to contain only ',' as a separator.
// Note, DirectiveSet may not be created at this point yet since this code
// is called from initial stub geenration code.
char* local_list = (char*)DirectiveSet::canonicalize_disableintrinsic(DisableIntrinsic);
bool found = false;
char* token = strtok(local_list, ",");
while (token != NULL) {
if (strcmp(token, vmIntrinsics::name_at(id)) == 0) {
found = true;
break;
} else {
token = strtok(NULL, ",");
}
}
FREE_C_HEAP_ARRAY(char, local_list);
return found;
}
bool vmIntrinsics::is_disabled_by_flags(const methodHandle& method) {
vmIntrinsics::ID id = method->intrinsic_id();
assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
return is_disabled_by_flags(id);
}
bool vmIntrinsics::is_disabled_by_flags(vmIntrinsics::ID id) {
assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
// -XX:-InlineNatives disables nearly all intrinsics except the ones listed in
// the following switch statement.