This commit is contained in:
Jon Masamitsu 2014-08-08 07:38:34 -07:00
commit 1cf05b831f
16 changed files with 52 additions and 108 deletions

View file

@ -661,30 +661,30 @@ init_classsharing_workaround(void *cd, const prmap_t* pmap, const char* obj_name
// read FileMapHeader // read FileMapHeader
size_t n = read(fd, pheader, sizeof(struct FileMapHeader)); size_t n = read(fd, pheader, sizeof(struct FileMapHeader));
if (n != sizeof(struct FileMapHeader)) { if (n != sizeof(struct FileMapHeader)) {
free(pheader);
close(fd);
char errMsg[ERR_MSG_SIZE]; char errMsg[ERR_MSG_SIZE];
sprintf(errMsg, "unable to read shared archive file map header from %s", classes_jsa); sprintf(errMsg, "unable to read shared archive file map header from %s", classes_jsa);
close(fd);
free(pheader);
THROW_NEW_DEBUGGER_EXCEPTION_(errMsg, 1); THROW_NEW_DEBUGGER_EXCEPTION_(errMsg, 1);
} }
// check file magic // check file magic
if (pheader->_magic != 0xf00baba2) { if (pheader->_magic != 0xf00baba2) {
free(pheader);
close(fd);
char errMsg[ERR_MSG_SIZE]; char errMsg[ERR_MSG_SIZE];
sprintf(errMsg, "%s has bad shared archive magic 0x%x, expecting 0xf00baba2", sprintf(errMsg, "%s has bad shared archive magic 0x%x, expecting 0xf00baba2",
classes_jsa, pheader->_magic); classes_jsa, pheader->_magic);
close(fd);
free(pheader);
THROW_NEW_DEBUGGER_EXCEPTION_(errMsg, 1); THROW_NEW_DEBUGGER_EXCEPTION_(errMsg, 1);
} }
// check version // check version
if (pheader->_version != CURRENT_ARCHIVE_VERSION) { if (pheader->_version != CURRENT_ARCHIVE_VERSION) {
free(pheader);
close(fd);
char errMsg[ERR_MSG_SIZE]; char errMsg[ERR_MSG_SIZE];
sprintf(errMsg, "%s has wrong shared archive version %d, expecting %d", sprintf(errMsg, "%s has wrong shared archive version %d, expecting %d",
classes_jsa, pheader->_version, CURRENT_ARCHIVE_VERSION); classes_jsa, pheader->_version, CURRENT_ARCHIVE_VERSION);
close(fd);
free(pheader);
THROW_NEW_DEBUGGER_EXCEPTION_(errMsg, 1); THROW_NEW_DEBUGGER_EXCEPTION_(errMsg, 1);
} }

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2005, 2014, 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
@ -58,6 +58,8 @@ DTRACE_SRCDIR = $(GAMMADIR)/src/os/$(Platform_os_family)/dtrace
DTRACE_COMMON_SRCDIR = $(GAMMADIR)/src/os/posix/dtrace DTRACE_COMMON_SRCDIR = $(GAMMADIR)/src/os/posix/dtrace
DTRACE = dtrace DTRACE = dtrace
DTRACE.o = $(DTRACE).o DTRACE.o = $(DTRACE).o
DTRACE_JHELPER = dtrace_jhelper
DTRACE_JHELPER.o = $(DTRACE_JHELPER).o
# to remove '-g' option which causes link problems # to remove '-g' option which causes link problems
# also '-z nodefs' is used as workaround # also '-z nodefs' is used as workaround
@ -255,7 +257,10 @@ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
endif endif
$(DTRACE).d: $(DTRACE_COMMON_SRCDIR)/hotspot.d $(DTRACE_COMMON_SRCDIR)/hotspot_jni.d \ $(DTRACE).d: $(DTRACE_COMMON_SRCDIR)/hotspot.d $(DTRACE_COMMON_SRCDIR)/hotspot_jni.d \
$(DTRACE_COMMON_SRCDIR)/hs_private.d $(DTRACE_SRCDIR)/jhelper.d $(DTRACE_COMMON_SRCDIR)/hs_private.d
$(QUIETLY) cat $^ > $@
$(DTRACE_JHELPER).d: $(DTRACE_SRCDIR)/jhelper.d
$(QUIETLY) cat $^ > $@ $(QUIETLY) cat $^ > $@
DTraced_Files = ciEnv.o \ DTraced_Files = ciEnv.o \
@ -280,7 +285,7 @@ DTraced_Files = ciEnv.o \
vmGCOperations.o \ vmGCOperations.o \
# Dtrace is available, so we build $(DTRACE.o) # Dtrace is available, so we build $(DTRACE.o)
$(DTRACE.o): $(DTRACE).d $(JVMOFFS).h $(JVMOFFS)Index.h $(DTraced_Files) $(DTRACE.o): $(DTRACE).d $(DTraced_Files)
@echo Compiling $(DTRACE).d @echo Compiling $(DTRACE).d
$(QUIETLY) $(DTRACE_PROG) $(DTRACE_OPTS) -C -I. -G -xlazyload -o $@ -s $(DTRACE).d \ $(QUIETLY) $(DTRACE_PROG) $(DTRACE_OPTS) -C -I. -G -xlazyload -o $@ -s $(DTRACE).d \
@ -344,6 +349,11 @@ $(DtraceOutDir)/hs_private.h: $(DTRACE_COMMON_SRCDIR)/hs_private.d | $(DtraceOut
dtrace_gen_headers: $(DtraceOutDir)/hotspot.h $(DtraceOutDir)/hotspot_jni.h $(DtraceOutDir)/hs_private.h dtrace_gen_headers: $(DtraceOutDir)/hotspot.h $(DtraceOutDir)/hotspot_jni.h $(DtraceOutDir)/hs_private.h
# The jhelper.d and hotspot probes are separated into two different SUNW_dof sections.
# Now the jhelper.d is built without the -Xlazyload flag.
$(DTRACE_JHELPER.o) : $(DTRACE_JHELPER).d $(JVMOFFS).h $(JVMOFFS)Index.h
@echo Compiling $(DTRACE_JHELPER).d
$(QUIETLY) $(DTRACE_PROG) $(DTRACE_OPTS) -C -I. -G -o $@ -s $(DTRACE_JHELPER).d
.PHONY: dtraceCheck .PHONY: dtraceCheck
@ -372,7 +382,7 @@ endif # ifneq ("$(patchDtraceFound)", "")
ifneq ("${DTRACE_PROG}", "") ifneq ("${DTRACE_PROG}", "")
ifeq ("${HOTSPOT_DISABLE_DTRACE_PROBES}", "") ifeq ("${HOTSPOT_DISABLE_DTRACE_PROBES}", "")
DTRACE_OBJS = $(DTRACE.o) $(JVMOFFS.o) DTRACE_OBJS = $(DTRACE.o) $(JVMOFFS.o) $(DTRACE_JHELPER.o)
CFLAGS += $(DTRACE_INCL) -DDTRACE_ENABLED CFLAGS += $(DTRACE_INCL) -DDTRACE_ENABLED
MAPFILE_DTRACE_OPT = $(MAPFILE_DTRACE) MAPFILE_DTRACE_OPT = $(MAPFILE_DTRACE)

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2014, 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
@ -54,21 +54,6 @@ StackMapFrame* StackMapFrame::frame_in_exception_handler(u1 flags) {
return frame; return frame;
} }
bool StackMapFrame::has_new_object() const {
int32_t i;
for (i = 0; i < _max_locals; i++) {
if (_locals[i].is_uninitialized()) {
return true;
}
}
for (i = 0; i < _stack_size; i++) {
if (_stack[i].is_uninitialized()) {
return true;
}
}
return false;
}
void StackMapFrame::initialize_object( void StackMapFrame::initialize_object(
VerificationType old_object, VerificationType new_object) { VerificationType old_object, VerificationType new_object) {
int32_t i; int32_t i;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2014, 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
@ -154,10 +154,6 @@ class StackMapFrame : public ResourceObj {
VerificationType set_locals_from_arg( VerificationType set_locals_from_arg(
const methodHandle m, VerificationType thisKlass, TRAPS); const methodHandle m, VerificationType thisKlass, TRAPS);
// Search local variable type array and stack type array.
// Return true if an uninitialized object is found.
bool has_new_object() const;
// Search local variable type array and stack type array. // Search local variable type array and stack type array.
// Set every element with type of old_object to new_object. // Set every element with type of old_object to new_object.
void initialize_object( void initialize_object(

View file

@ -70,24 +70,26 @@ int StackMapTable::get_index_from_offset(int32_t offset) const {
bool StackMapTable::match_stackmap( bool StackMapTable::match_stackmap(
StackMapFrame* frame, int32_t target, StackMapFrame* frame, int32_t target,
bool match, bool update, ErrorContext* ctx, TRAPS) const { bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const {
int index = get_index_from_offset(target); int index = get_index_from_offset(target);
return match_stackmap(frame, target, index, match, update, ctx, THREAD); return match_stackmap(frame, target, index, match, update, handler, ctx, THREAD);
} }
// Match and/or update current_frame to the frame in stackmap table with // Match and/or update current_frame to the frame in stackmap table with
// specified offset and frame index. Return true if the two frames match. // specified offset and frame index. Return true if the two frames match.
// handler is true if the frame in stackmap_table is for an exception handler.
// //
// The values of match and update are: _match__update_ // The values of match and update are: _match__update__handler
// //
// checking a branch target/exception handler: true false // checking a branch target: true false false
// checking an exception handler: true false true
// linear bytecode verification following an // linear bytecode verification following an
// unconditional branch: false true // unconditional branch: false true false
// linear bytecode verification not following an // linear bytecode verification not following an
// unconditional branch: true true // unconditional branch: true true false
bool StackMapTable::match_stackmap( bool StackMapTable::match_stackmap(
StackMapFrame* frame, int32_t target, int32_t frame_index, StackMapFrame* frame, int32_t target, int32_t frame_index,
bool match, bool update, ErrorContext* ctx, TRAPS) const { bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const {
if (frame_index < 0 || frame_index >= _frame_count) { if (frame_index < 0 || frame_index >= _frame_count) {
*ctx = ErrorContext::missing_stackmap(frame->offset()); *ctx = ErrorContext::missing_stackmap(frame->offset());
frame->verifier()->verify_error( frame->verifier()->verify_error(
@ -98,11 +100,9 @@ bool StackMapTable::match_stackmap(
StackMapFrame *stackmap_frame = _frame_array[frame_index]; StackMapFrame *stackmap_frame = _frame_array[frame_index];
bool result = true; bool result = true;
if (match) { if (match) {
// when checking handler target, match == true && update == false
bool is_exception_handler = !update;
// Has direct control flow from last instruction, need to match the two // Has direct control flow from last instruction, need to match the two
// frames. // frames.
result = frame->is_assignable_to(stackmap_frame, is_exception_handler, result = frame->is_assignable_to(stackmap_frame, handler,
ctx, CHECK_VERIFY_(frame->verifier(), result)); ctx, CHECK_VERIFY_(frame->verifier(), result));
} }
if (update) { if (update) {
@ -126,24 +126,10 @@ void StackMapTable::check_jump_target(
StackMapFrame* frame, int32_t target, TRAPS) const { StackMapFrame* frame, int32_t target, TRAPS) const {
ErrorContext ctx; ErrorContext ctx;
bool match = match_stackmap( bool match = match_stackmap(
frame, target, true, false, &ctx, CHECK_VERIFY(frame->verifier())); frame, target, true, false, false, &ctx, CHECK_VERIFY(frame->verifier()));
if (!match || (target < 0 || target >= _code_length)) { if (!match || (target < 0 || target >= _code_length)) {
frame->verifier()->verify_error(ctx, frame->verifier()->verify_error(ctx,
"Inconsistent stackmap frames at branch target %d", target); "Inconsistent stackmap frames at branch target %d", target);
return;
}
// check if uninitialized objects exist on backward branches
check_new_object(frame, target, CHECK_VERIFY(frame->verifier()));
frame->verifier()->update_furthest_jump(target);
}
void StackMapTable::check_new_object(
const StackMapFrame* frame, int32_t target, TRAPS) const {
if (frame->offset() > target && frame->has_new_object()) {
frame->verifier()->verify_error(
ErrorContext::bad_code(frame->offset()),
"Uninitialized object exists on backward branch %d", target);
return;
} }
} }

View file

@ -60,12 +60,12 @@ class StackMapTable : public StackObj {
// specified offset. Return true if the two frames match. // specified offset. Return true if the two frames match.
bool match_stackmap( bool match_stackmap(
StackMapFrame* current_frame, int32_t offset, StackMapFrame* current_frame, int32_t offset,
bool match, bool update, ErrorContext* ctx, TRAPS) const; bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const;
// Match and/or update current_frame to the frame in stackmap table with // Match and/or update current_frame to the frame in stackmap table with
// specified offset and frame index. Return true if the two frames match. // specified offset and frame index. Return true if the two frames match.
bool match_stackmap( bool match_stackmap(
StackMapFrame* current_frame, int32_t offset, int32_t frame_index, StackMapFrame* current_frame, int32_t offset, int32_t frame_index,
bool match, bool update, ErrorContext* ctx, TRAPS) const; bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const;
// Check jump instructions. Make sure there are no uninitialized // Check jump instructions. Make sure there are no uninitialized
// instances on backward branch. // instances on backward branch.
@ -76,10 +76,6 @@ class StackMapTable : public StackObj {
// Returns the frame array index where the frame with offset is stored. // Returns the frame array index where the frame with offset is stored.
int get_index_from_offset(int32_t offset) const; int get_index_from_offset(int32_t offset) const;
// Make sure that there's no uninitialized object exist on backward branch.
void check_new_object(
const StackMapFrame* frame, int32_t target, TRAPS) const;
void print_on(outputStream* str) const; void print_on(outputStream* str) const;
}; };

View file

@ -620,8 +620,6 @@ void ClassVerifier::verify_method(methodHandle m, TRAPS) {
// flow from current instruction to the next // flow from current instruction to the next
// instruction in sequence // instruction in sequence
set_furthest_jump(0);
Bytecodes::Code opcode; Bytecodes::Code opcode;
while (!bcs.is_last_bytecode()) { while (!bcs.is_last_bytecode()) {
// Check for recursive re-verification before each bytecode. // Check for recursive re-verification before each bytecode.
@ -1780,7 +1778,7 @@ u2 ClassVerifier::verify_stackmap_table(u2 stackmap_index, u2 bci,
// If matched, current_frame will be updated by this method. // If matched, current_frame will be updated by this method.
bool matches = stackmap_table->match_stackmap( bool matches = stackmap_table->match_stackmap(
current_frame, this_offset, stackmap_index, current_frame, this_offset, stackmap_index,
!no_control_flow, true, &ctx, CHECK_VERIFY_(this, 0)); !no_control_flow, true, false, &ctx, CHECK_VERIFY_(this, 0));
if (!matches) { if (!matches) {
// report type error // report type error
verify_error(ctx, "Instruction type does not match stack map"); verify_error(ctx, "Instruction type does not match stack map");
@ -1827,7 +1825,7 @@ void ClassVerifier::verify_exception_handler_targets(u2 bci, bool this_uninit, S
} }
ErrorContext ctx; ErrorContext ctx;
bool matches = stackmap_table->match_stackmap( bool matches = stackmap_table->match_stackmap(
new_frame, handler_pc, true, false, &ctx, CHECK_VERIFY(this)); new_frame, handler_pc, true, false, true, &ctx, CHECK_VERIFY(this));
if (!matches) { if (!matches) {
verify_error(ctx, "Stack map does not match the one at " verify_error(ctx, "Stack map does not match the one at "
"exception handler %d", handler_pc); "exception handler %d", handler_pc);
@ -2238,13 +2236,6 @@ void ClassVerifier::verify_invoke_init(
return; return;
} }
// Make sure that this call is not jumped over.
if (bci < furthest_jump()) {
verify_error(ErrorContext::bad_code(bci),
"Bad <init> method call from inside of a branch");
return;
}
// Make sure that this call is not done from within a TRY block because // Make sure that this call is not done from within a TRY block because
// that can result in returning an incomplete object. Simply checking // that can result in returning an incomplete object. Simply checking
// (bci >= start_pc) also ensures that this call is not done after a TRY // (bci >= start_pc) also ensures that this call is not done after a TRY

View file

@ -258,9 +258,6 @@ class ClassVerifier : public StackObj {
ErrorContext _error_context; // contains information about an error ErrorContext _error_context; // contains information about an error
// Used to detect illegal jumps over calls to super() nd this() in ctors.
int32_t _furthest_jump;
void verify_method(methodHandle method, TRAPS); void verify_method(methodHandle method, TRAPS);
char* generate_code_data(methodHandle m, u4 code_length, TRAPS); char* generate_code_data(methodHandle m, u4 code_length, TRAPS);
void verify_exception_handler_table(u4 code_length, char* code_data, void verify_exception_handler_table(u4 code_length, char* code_data,
@ -407,19 +404,6 @@ class ClassVerifier : public StackObj {
TypeOrigin ref_ctx(const char* str, TRAPS); TypeOrigin ref_ctx(const char* str, TRAPS);
// Keep track of the furthest branch done in a method to make sure that
// there are no branches over calls to super() or this() from inside of
// a constructor.
int32_t furthest_jump() { return _furthest_jump; }
void set_furthest_jump(int32_t target) {
_furthest_jump = target;
}
void update_furthest_jump(int32_t target) {
if (target > _furthest_jump) _furthest_jump = target;
}
}; };
inline int ClassVerifier::change_sig_to_verificationType( inline int ClassVerifier::change_sig_to_verificationType(

View file

@ -987,17 +987,6 @@ ConstantPoolCacheEntry *cp_entry))
int index = cp_entry->field_index(); int index = cp_entry->field_index();
if ((ik->field_access_flags(index) & JVM_ACC_FIELD_ACCESS_WATCHED) == 0) return; if ((ik->field_access_flags(index) & JVM_ACC_FIELD_ACCESS_WATCHED) == 0) return;
switch(cp_entry->flag_state()) {
case btos: // fall through
case ctos: // fall through
case stos: // fall through
case itos: // fall through
case ftos: // fall through
case ltos: // fall through
case dtos: // fall through
case atos: break;
default: ShouldNotReachHere(); return;
}
bool is_static = (obj == NULL); bool is_static = (obj == NULL);
HandleMark hm(thread); HandleMark hm(thread);

View file

@ -283,6 +283,13 @@ address Method::bcp_from(int bci) const {
return bcp; return bcp;
} }
address Method::bcp_from(address bcp) const {
if (is_native() && bcp == NULL) {
return code_base();
} else {
return bcp;
}
}
int Method::size(bool is_native) { int Method::size(bool is_native) {
// If native, then include pointers for native_function and signature_handler // If native, then include pointers for native_function and signature_handler

View file

@ -648,7 +648,8 @@ class Method : public Metadata {
// Returns the byte code index from the byte code pointer // Returns the byte code index from the byte code pointer
int bci_from(address bcp) const; int bci_from(address bcp) const;
address bcp_from(int bci) const; address bcp_from(int bci) const;
address bcp_from(address bcp) const;
int validate_bci_from_bcp(address bcp) const; int validate_bci_from_bcp(address bcp) const;
int validate_bci(int bci) const; int validate_bci(int bci) const;

View file

@ -407,7 +407,8 @@ jint frame::interpreter_frame_bci() const {
address frame::interpreter_frame_bcp() const { address frame::interpreter_frame_bcp() const {
assert(is_interpreted_frame(), "interpreted frame expected"); assert(is_interpreted_frame(), "interpreted frame expected");
return (address)*interpreter_frame_bcp_addr(); address bcp = (address)*interpreter_frame_bcp_addr();
return interpreter_frame_method()->bcp_from(bcp);
} }
void frame::interpreter_frame_set_bcp(address bcp) { void frame::interpreter_frame_set_bcp(address bcp) {

View file

@ -25,7 +25,6 @@
# #
## ##
## @ignore 8025519
## @test Test7107135.sh ## @test Test7107135.sh
## @bug 7107135 ## @bug 7107135
## @bug 8021296 ## @bug 8021296

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014, 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
@ -147,7 +147,8 @@ class VerifyErrorCases {
"no stackmap frame at jump location or bad jump", "no stackmap frame at jump location or bad jump",
"Inconsistent stackmap frames at branch target "), "Inconsistent stackmap frames at branch target "),
new Case("case15", "stackMapTable.cpp", true, "check_new_object", /* Backward jump with uninit is allowed starting with JDK 8 */
new Case("case15", "stackMapTable.cpp", false, "check_new_object",
"backward jump with uninit", "backward jump with uninit",
"Uninitialized object exists on backward branch "), "Uninitialized object exists on backward branch "),

View file

@ -21,8 +21,7 @@
* questions. * questions.
*/ */
/* @ignore JDK-8043896 /* @test LimitSharedSizes
* @test LimitSharedSizes
* @summary Test handling of limits on shared space size * @summary Test handling of limits on shared space size
* @library /testlibrary * @library /testlibrary
* @run main LimitSharedSizes * @run main LimitSharedSizes

View file

@ -24,7 +24,6 @@
# #
## ##
## @ignore 8028806
## @test Test8017498.sh ## @test Test8017498.sh
## @bug 8017498 ## @bug 8017498
## @bug 8020791 ## @bug 8020791