7152811: Issues in client compiler
Reviewed-by: kvn, jrose
This commit is contained in:
parent
fbcf78297f
commit
3e6d198cf7
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -67,7 +67,7 @@
|
|||||||
|
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
// ciField::ciField
|
// ciField::ciField
|
||||||
ciField::ciField(ciInstanceKlass* klass, int index): _known_to_link_with(NULL) {
|
ciField::ciField(ciInstanceKlass* klass, int index): _known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
|
||||||
ASSERT_IN_VM;
|
ASSERT_IN_VM;
|
||||||
CompilerThread *thread = CompilerThread::current();
|
CompilerThread *thread = CompilerThread::current();
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ ciField::ciField(ciInstanceKlass* klass, int index): _known_to_link_with(NULL) {
|
|||||||
initialize_from(&field_desc);
|
initialize_from(&field_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
ciField::ciField(fieldDescriptor *fd): _known_to_link_with(NULL) {
|
ciField::ciField(fieldDescriptor *fd): _known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
|
||||||
ASSERT_IN_VM;
|
ASSERT_IN_VM;
|
||||||
|
|
||||||
_cp_index = -1;
|
_cp_index = -1;
|
||||||
@ -315,6 +315,10 @@ ciType* ciField::compute_type_impl() {
|
|||||||
bool ciField::will_link(ciInstanceKlass* accessing_klass,
|
bool ciField::will_link(ciInstanceKlass* accessing_klass,
|
||||||
Bytecodes::Code bc) {
|
Bytecodes::Code bc) {
|
||||||
VM_ENTRY_MARK;
|
VM_ENTRY_MARK;
|
||||||
|
assert(bc == Bytecodes::_getstatic || bc == Bytecodes::_putstatic ||
|
||||||
|
bc == Bytecodes::_getfield || bc == Bytecodes::_putfield,
|
||||||
|
"unexpected bytecode");
|
||||||
|
|
||||||
if (_offset == -1) {
|
if (_offset == -1) {
|
||||||
// at creation we couldn't link to our holder so we need to
|
// at creation we couldn't link to our holder so we need to
|
||||||
// maintain that stance, otherwise there's no safe way to use this
|
// maintain that stance, otherwise there's no safe way to use this
|
||||||
@ -322,8 +326,21 @@ bool ciField::will_link(ciInstanceKlass* accessing_klass,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_known_to_link_with == accessing_klass) {
|
// Check for static/nonstatic mismatch
|
||||||
return true;
|
bool is_static = (bc == Bytecodes::_getstatic || bc == Bytecodes::_putstatic);
|
||||||
|
if (is_static != this->is_static()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get and put can have different accessibility rules
|
||||||
|
bool is_put = (bc == Bytecodes::_putfield || bc == Bytecodes::_putstatic);
|
||||||
|
if (is_put) {
|
||||||
|
if (_known_to_link_with_put == accessing_klass) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (_known_to_link_with_get == accessing_klass) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FieldAccessInfo result;
|
FieldAccessInfo result;
|
||||||
@ -334,8 +351,13 @@ bool ciField::will_link(ciInstanceKlass* accessing_klass,
|
|||||||
true, false, KILL_COMPILE_ON_FATAL_(false));
|
true, false, KILL_COMPILE_ON_FATAL_(false));
|
||||||
|
|
||||||
// update the hit-cache, unless there is a problem with memory scoping:
|
// update the hit-cache, unless there is a problem with memory scoping:
|
||||||
if (accessing_klass->is_shared() || !is_shared())
|
if (accessing_klass->is_shared() || !is_shared()) {
|
||||||
_known_to_link_with = accessing_klass;
|
if (is_put) {
|
||||||
|
_known_to_link_with_put = accessing_klass;
|
||||||
|
} else {
|
||||||
|
_known_to_link_with_get = accessing_klass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -49,7 +49,8 @@ private:
|
|||||||
ciType* _type;
|
ciType* _type;
|
||||||
int _offset;
|
int _offset;
|
||||||
bool _is_constant;
|
bool _is_constant;
|
||||||
ciInstanceKlass* _known_to_link_with;
|
ciInstanceKlass* _known_to_link_with_put;
|
||||||
|
ciInstanceKlass* _known_to_link_with_get;
|
||||||
ciConstant _constant_value;
|
ciConstant _constant_value;
|
||||||
|
|
||||||
// Used for will_link
|
// Used for will_link
|
||||||
|
Loading…
x
Reference in New Issue
Block a user