RFR (M) JDK-8210012: Implement Unified Logging Option for -XX:+TraceMethodHandles and -XX:+TraceInvokeDynamic
Lois Foltan
lois.foltan at oracle.com
Fri Apr 10 22:05:13 UTC 2020
> On 4/9/20 8:12 PM, David Holmes wrote:
>> Hi Lois,
>>
>> On 10/04/2020 4:42 am, Lois Foltan wrote:
>>> Please review the following change to implement unified logging
>>> options for -XX:+TraceMethodHandles and -XX:+TraceInvokeDynamic. The
>>> new options map as follows:
>>>
>>> -XX:+TraceMethodHandles --> -Xlog:methodhandles=info
>>> -XX:+TraceInvokeDynamic --> -Xlog:methodhandles+indy=debug
>>>
>>> and in addition dynamic constants can now be viewed under their own
>>> option via -Xlog:methodhandles+condy=debug
>>>
>>> open webrev at:
>>> http://cr.openjdk.java.net/~lfoltan/bug_jdk8210012.0/webrev/
>>> bug link: https://bugs.openjdk.java.net/browse/JDK-8210012
>>
>> Generally looks good. A couple of things.
>>
>> First the change in compileTask.cpp seems wrong: you should get the
>> timestamp from the specified stream not the tty.
>>
>> Second the changes to wrap_dynamic_exception seem rather awkward,
>> both in terms of having to remember what the initial boolean arg
>> represents at the call site, and more so in the logic to determine
>> which log stream to use. I was wondering if it might be better to add
>> wrap_dynamic_exception_for_indy to keep the call sites clean?
>> Otherwise perhaps document like "true /* indy */" and "false /* not
>> indy */.
>>
>> For the log stream logic I was assuming there must be a
>> better/simpler way, but after looking at it in some detail it seems
>> not. :(
>>
>
> Hi Lois,
Hi Ioi,
Thanks for the review!
>
>
> LinkResolver::lookup_polymorphic_method()
> + ResourceMark rm(THREAD);
>
> Is this ResourceMark used only for logging?
Yes. As a matter of fact specifying -XX:+TraceMethodHandles or
-XX:+TraceInvokeDynamic currently on my sample test case results today
in crashes concerning the lack of allocating without a ResourceMark.
>
> =================
> For code like this in ConstantPool::resolve_constant_at_impl:
>
> if (log_is_enabled(Debug, methodhandles, condy)) {
> LogTarget(Debug, methodhandles, condy) lt;
> LogStream ls(lt);
> bootstrap_specifier.print_msg_on(&ls, "resolve_constant_at_impl");
> }
>
> The second set of tags can be avoided by declaring LogTarget(Debug,
> methodhandles, condy) first. There's an example of this style in
> FileMapInfo::log_paths().
>
> LogTarget(Debug, methodhandles, condy) lt;
> if (lt.is_enabled()) {
> LogStream ls(lt);
> bootstrap_specifier.print_msg_on(&ls, "resolve_constant_at_impl");
> }
Fixed, I have changed all checks in this webrev to consistently use this
form of checking if LogTarget is enabled.
>
> =================
>
> unpack_method_and_appendix() {
>
> if (log_develop_is_enabled(Info, methodhandles)) {
> ResourceMark rm(THREAD);
> LogTarget(Info, methodhandles) lt;
> LogStream ls(lt);
> ls->print_on(.....);
>
> This can be fixed similarly, if we add a new function to LogTargetImpl:
>
> class LogTargetImpl {
> static bool develop_is_enabled() {
> NOT_PRODUCT(return LogImpl<T0, T1, T2, T3, T4,
> GuardTag>::is_level(level));
> PRODUCT_ONLY(return false);
> }
> ...
> }
>
> LogTarget(Info, methodhandles) lt;
> if (lt.develop_is_enabled()) {
> ResourceMark rm(THREAD);
> LogStream ls(lt);
> ls->print_on(.....);
Fixed. Added the method "develop_is_enabled()" to class LogTargetImpl.
However my method looks more like this:
static bool develop_is_enabled() {
NOT_PRODUCT(return is_enabled();)
PRODUCT_ONLY(return false);
}
>
> =================
> void ConstantPoolCacheEntry::set_method_handle_common()
>
> LogStreamHandle(Debug, methodhandles, indy) lsh;
> if (log_is_enabled(Debug, methodhandles, indy)) {
>
> Maybe we should add a new function LogStream::is_enabled so we can:
>
> LogStreamHandle(Debug, methodhandles, indy) lsh;
> if (lsh.is_enabled()) {
Fixed. Turns out that a LogTargetHandle already has an "is_enabled()"
method. So I added an "is_enabled()" method to class LogStream to check
if its field, _log_handle, whose type is LogTargetHandle, is enabled.
>
>
> =================
> Not a comment about this patch, but in general, I am not happy with
> the verbosity when a ResourceMark is needed in logging.
>
> I think the best way to avoid the verbosity would be to use C++ lambda
> expressions (are we allowed??), or (oh gosh!) maybe a macro? (Probably
> in a separate RFE).
>
> LOG_WITH_RESOURCE_MARK((Info, methodhandles), THREAD,ls, {
> ls->print_on(.....);
> });
Good idea, but will create an RFE for this.
New webrev at:
http://cr.openjdk.java.net/~lfoltan/bug_jdk8210012.1/webrev/index.html
Thanks,
Lois
>
>
> Thanks
> - Ioi
>
>
>> Thanks,
>> David
>>
>>> Testing: hs-tier1-5
>>>
>>> Thanks,
>>> Lois
>
More information about the hotspot-dev
mailing list