On Mon, 5 Jun 2023 19:26:59 GMT, Cesar Soares Lucas <cslu...@openjdk.org> wrote:
>> src/hotspot/share/code/debugInfo.cpp line 301: >> >>> 299: void ObjectMergeValue::print_detailed(outputStream* st) const { >>> 300: st->print("merge: ID=%d", _id); >>> 301: #ifndef PRODUCT >> >> Can you post a sample of the output, please? >> >> Why is it limited to non-product builds? It's valuable irrespective of build >> flavor. >> >> As I see in `ObjectValue::print_on` and `ScopeDesc::print_on`, you mix >> `print_on` with `print_fields_on`. Any particular reason for that? You could >> add `is_object_merge` case in ObjectValue::print_on` instead and extend >> `ObjectValue::print_fields_on` to cover `ObjectMergeValue` case. I find it >> hard to reason about `ObjectValue::print_on` vs `ObjectMergeValue::print_on` >> since it's a non-virtual method. >> >> >> >> Also, formatting is broken. > > I added a few samples below and there are a few more here: > https://gist.github.com/JohnTortugo/913523947e08157def6cfebafa7d5daa > > Sample 1: > > > Compiled method (c2) 415 24 TestTrapAfterMerge::test (57 > bytes) > total in heap [0x00007f7b4d03da90,0x00007f7b4d03de18] = 904 > relocation [0x00007f7b4d03dc00,0x00007f7b4d03dc18] = 24 > main code [0x00007f7b4d03dc20,0x00007f7b4d03dcb8] = 152 > stub code [0x00007f7b4d03dcb8,0x00007f7b4d03dcd0] = 24 > oops [0x00007f7b4d03dcd0,0x00007f7b4d03dce0] = 16 > metadata [0x00007f7b4d03dce0,0x00007f7b4d03dce8] = 8 > scopes data [0x00007f7b4d03dce8,0x00007f7b4d03dd50] = 104 > scopes pcs [0x00007f7b4d03dd50,0x00007f7b4d03de10] = 192 > dependencies [0x00007f7b4d03de10,0x00007f7b4d03de18] = 8 > scopes: > ScopeDesc(pc=0x00007f7b4d03dc3a offset=1a): > TestTrapAfterMerge::test@-1 (line 3) > ScopeDesc(pc=0x00007f7b4d03dc41 offset=21): > TestTrapAfterMerge::test@11 (line 5) > ScopeDesc(pc=0x00007f7b4d03dc44 offset=24): > TestTrapAfterMerge::test@51 (line 12) > ScopeDesc(pc=0x00007f7b4d03dc4a offset=2a): > TestTrapAfterMerge::test@46 (line 8) > ScopeDesc(pc=0x00007f7b4d03dc52 offset=32): > TestTrapAfterMerge::test@37 (line 9) > ScopeDesc(pc=0x00007f7b4d03dc57 offset=37): > TestTrapAfterMerge::test@43 (line 8) > ScopeDesc(pc=0x00007f7b4d03dc61 offset=41): > TestTrapAfterMerge::test@46 (line 8) reexecute=true > Locals > - l0: empty > - l1: empty > - l2: reg rbx [6],int > - l3: empty > - l4: merge: ID=26 > - l5: reg r11 [22],int > Objects > - 0: merge: ID=26, selector="reg r10 [20],int", merge_pointer="nullptr", > candidate objs=[27, 28] > - 1: obj: ID=27, is_root=0, N.Fields=1, klass: Point > Fields: reg r8 [16],int > - 2: obj: ID=28, is_root=0, N.Fields=1, klass: Point > Fields: reg rcx [2],int > ScopeDesc(pc=0x00007f7b4d03dc63 offset=43): > TestTrapAfterMerge::test@46 (line 8) > ScopeDesc(pc=0x00007f7b4d03dc6c offset=4c): > TestTrapAfterMerge::test@34 (line 8) > ScopeDesc(pc=0x00007f7b4d03dc71 offset=51): > TestTrapAfterMerge::test@55 (line 12) > > > - Sample2: > > > Compiled method (c2) 443 24 TestManys::test (41 bytes) > total in heap [0x00007f35e9155b90,0x00007f35e9155e78] = 744 > relocation [0x00007f35e9155d00,0x00007f35e9155d18] = 24 > main code [0x00007f35e9155d20,0x00007f35e9155d88] = 104 > stub code [0x00007f35e9155d88,0x00007f35e9155da0] = 24 > oops [0x00007f35e9155da0,0x00007f35e9155db0] =... > Why is it limited to non-product builds? It's valuable irrespective of build > flavor. This is because `print_on` in `AnyObj` is only defined in non-product builds. I based implementation of `ObjectMergeValue::print_on` on `ObjectValue::print_on`. In `ObjectValue::print_on` fields aren't printed in product builds. > Any particular reason for that? You could add is_object_merge case in > ObjectValue::print_oninstead and extendObjectValue::print_fields_onto > coverObjectMergeValue case. I'll do that then. > Also, formatting is broken. Can you please share an example? If you mean the tabs on lines 303/304/306/307 I added those because I thought would make the code easier to read, but if you want I can definitely remove that. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/12897#discussion_r1218523643