Mercurial > hg > truffle
diff src/share/vm/code/debugInfoRec.cpp @ 7046:b6a8f2d23057
VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Tue, 27 Nov 2012 13:43:04 +0100 |
parents | e522a00b91aa |
children | 0b646334c5f7 |
line wrap: on
line diff
--- a/src/share/vm/code/debugInfoRec.cpp Tue Nov 27 12:10:41 2012 +0100 +++ b/src/share/vm/code/debugInfoRec.cpp Tue Nov 27 13:43:04 2012 +0100 @@ -213,6 +213,29 @@ return result; } +#ifdef GRAAL + +int DebugInformationRecorder::serialize_deferred_writes(GrowableArray<DeferredWriteValue*>* deferred_writes) { + if (deferred_writes == NULL || deferred_writes->is_empty()) return DebugInformationRecorder::serialized_null; + assert(_recording_state == rs_safepoint, "must be recording a safepoint"); + int result = stream()->position(); + assert(result != serialized_null, "sanity"); + stream()->write_int(deferred_writes->length()); + for (int index = 0; index < deferred_writes->length(); index++) { + deferred_writes->at(index)->write_on(stream()); + } + + // (See comment below on DebugInformationRecorder::describe_scope.) + int shared_result = find_sharable_decode_offset(result); + if (shared_result != serialized_null) { + stream()->set_position(result); + result = shared_result; + } + + return result; +} + +#endif // GRAAL #ifndef PRODUCT // These variables are put into one block to reduce relocations @@ -289,7 +312,11 @@ bool return_oop, DebugToken* locals, DebugToken* expressions, - DebugToken* monitors) { + DebugToken* monitors +#ifdef GRAAL + , DebugToken* deferred_writes +#endif // GRAAL + ) { assert(_recording_state != rs_null, "nesting of recording calls"); PcDesc* last_pd = last_pc(); assert(last_pd->pc_offset() == pc_offset, "must be last pc"); @@ -328,6 +355,9 @@ stream()->write_int((intptr_t) locals); stream()->write_int((intptr_t) expressions); stream()->write_int((intptr_t) monitors); +#ifdef GRAAL + stream()->write_int((intptr_t) deferred_writes); +#endif // GRAAL // Here's a tricky bit. We just wrote some bytes. // Wouldn't it be nice to find that we had already @@ -409,6 +439,14 @@ return (DebugToken*) (intptr_t) serialize_monitor_values(monitors); } +#ifdef GRAAL + +DebugToken* DebugInformationRecorder::create_deferred_writes(GrowableArray<DeferredWriteValue*>* deferred_writes) { + assert(!recorders_frozen(), "not frozen yet"); + return (DebugToken*) (intptr_t) serialize_deferred_writes(deferred_writes); +} + +#endif // GRAAL int DebugInformationRecorder::data_size() { debug_only(mark_recorders_frozen()); // mark it "frozen" for asserts