I am analyzing the following Java code:
class Main {
private static class C{
private C ref;
}
private static void foo(C c, C c2){
c.ref = c2;
}
}
And JITed version of it:
[Entry Point]
[Verified Entry Point]
[Constants]
# {method} {0x00007ff5b3c02af8} 'foo' '(LMain$C;LMain$C;)V' in 'Main'
# parm0: rsi:rsi = 'Main$C'
# parm1: rdx:rdx = 'Main$C'
# [sp+0x50] (sp of caller)
0x00007ff5c110cc60: mov %eax,-0x14000(%rsp)
0x00007ff5c110cc67: push %rbp
0x00007ff5c110cc68: sub $0x40,%rsp
0x00007ff5c110cc6c: mov $0x7ff5b3c03200,%rdi ; What is value the
$0x7ff5b3c03200? (1)
0x00007ff5c110cc76: mov 0x8(%rdi),%ebx
0x00007ff5c110cc79: add $0x8,%ebx
0x00007ff5c110cc7c: mov %ebx,0x8(%rdi)
0x00007ff5c110cc7f: mov $0x7ff5b3c02af8,%rdi ; {metadata({method
} {0x00007ff5b3c02af8} 'foo' '(LMain$C;LMain$C;)V' in 'Main')}
0x00007ff5c110cc89: and $0x3ff8,%ebx ; What is the value
$0x3ff8 (2)
0x00007ff5c110cc8f: cmp $0x0,%ebx
0x00007ff5c110cc92: je 0x00007ff5c110ccc1 ;*aload_0
; - Main::foo@0 (line 11
)
0x00007ff5c110cc98: mov %rdx,%r10
0x00007ff5c110cc9b: shr $0x3,%r10 ; Why a param1(reference
to c2) is shifted right by 3? (3)
0x00007ff5c110cc9f: mov %r10d,0xc(%rsi) ; implicit exception:
dispatches to 0x00007ff5c110ccd5
0x00007ff5c110cca3: shr $0x9,%rsi
0x00007ff5c110cca7: mov $0x7ff5d13bd000,%rdi
0x00007ff5c110ccb1: movb $0x0,(%rsi,%rdi,1) ;*putfield ref
; - Main$C::access$002@3
(line 6)
; - Main::foo@2 (line 11
)
0x00007ff5c110ccb5: add $0x40,%rsp
0x00007ff5c110ccb9: pop %rbp
0x00007ff5c110ccba: test %eax,0x17d2c440(%rip) #
0x00007ff5d8e39100 What is a constant 0x17d2c440?
; {poll_return}
0x00007ff5c110ccc0: retq
0x00007ff5c110ccc1: mov %rdi,0x8(%rsp)
0x00007ff5c110ccc6: movq $0xffffffffffffffff,(%rsp)
0x00007ff5c110ccce: callq 0x00007ff5c1101560 ; OopMap{rsi=Oop rdx=
Oop off=115}
;*synchronization entry
; - Main::foo@-1 (line
11)
; {runtime_call}
0x00007ff5c110ccd3: jmp 0x00007ff5c110cc98
0x00007ff5c110ccd5: callq 0x00007ff5c106f7c0 ; OopMap{rsi=Oop off=
122}
;*putfield ref
; - Main$C::access$002@3
(line 6)
; - Main::foo@2 (line 11
)
; {runtime_call}
0x00007ff5c110ccda: nop
0x00007ff5c110ccdb: nop
0x00007ff5c110ccdc: mov 0x290(%r15),%rax
0x00007ff5c110cce3: mov $0x0,%r10
0x00007ff5c110cced: mov %r10,0x290(%r15)
0x00007ff5c110ccf4: mov $0x0,%r10
0x00007ff5c110ccfe: mov %r10,0x298(%r15)
0x00007ff5c110cd05: add $0x40,%rsp
0x00007ff5c110cd09: pop %rbp
0x00007ff5c110cd0a: jmpq 0x00007ff5c106e3e0 ; {runtime_call}
I don't understand some issues, and I would like to someone ask for it:
I've annotated line in the assembly code with numbers. For example,
The first question (1.) refers to the line annotated with (1). And so on.
1. What is value the $0x7ff5b3c03200?
2. What is the value $0x3ff8?
3. Why a param1(reference to c2) is shifted right by 3?
Thanks in advance :)
--
You received this message because you are subscribed to the Google Groups
"mechanical-sympathy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.