Avoid JVMTI global deoptimization when possible

This changes the openjdkjvmti plugin to be more controlled about the
situations that it will deoptimize everything. Most notably this makes
the plugin deoptimize only individual methods for breakpoints instead
of doing a full deoptimization. It also doesn't deoptimize for the
JVMTI_EVENT_EXCEPTION method, since our throwing code will always send
the appropriate event.

Impact:
    Exoplayer benchmark with breakpointlogger setting a breakpoint on
    a method that is never called.

    The agent is the tools/breakpoint-logger agent.

    'art' options are for all runs were:
        --64
        -Xusejit:true
        -Xcompiler-option --debuggable
    'art' options for 'Pre change' and 'Post change' runs included:
        -Xplugin:libopenjdkjvmti.so
        '-agentpath:libbreakpointlogger.so=Lbenchmarks/common/java/BenchmarkBase;->run()V@0'

    Clean run (no agent loaded):
        Running FMP4 x 1 : 53
        Running TS x 1 : 144
        Running FMP4 x 2500 : 3309
        Running TS x 100 : 3584
        ExoPlayerBench(RunTime): 6977000.0 us.
    Pre change:
        Running FMP4 x 1 : 159
        Running TS x 1 : 9395
        Running FMP4 x 2500 : 298591
        Running TS x 100 : 944447
        ExoPlayerBench(RunTime): 1.243226E9 us.
    Post change:
        Running FMP4 x 1 : 87
        Running TS x 1 : 495
        Running FMP4 x 2500 : 2939
        Running TS x 100 : 3947
        ExoPlayerBench(RunTime): 6979000.0 us.

    Post change vs clean run is well within margin of error for this
    benchmark.

Test: ./test.py --host -j50
Test: ./art/tools/run-prebuild-libjdwp-tests.sh

Bug: 62821960
Bug: 67958496

Change-Id: I63ef04f71c36c34d8534651d0c075921a836ec08
20 files changed