view agent/src/overrideFunc.S @ 60:eb050c7ccede

Bug 2529: HeapStats agent should hook InstanceClassLoaderKlass after JDK-6964458 reviewed-by: ykubota
author Yasumasa Suenaga <yasuenag@gmail.com>
date Thu, 16 Jul 2015 23:18:13 +0900
parents 6fee1594fa18
children ec74982008b5
line wrap: on
line source

/*!
 * \file overrideFunc.S
 * \brief This file is used to override JVM inner function.<br>
 * Copyright (C) 2011-2015 Nippon Telegraph and Telephone Corporation
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 */

/* Override functions of "do_oop" families */
	.file "overrideFunc.S"

#define OVERRIDE_FUNC_DEFINE(header, ary_idx) \
		.global header##_override_func_##ary_idx ;         \
		.type header##_override_func_##ary_idx, @function; \
	header##_override_func_##ary_idx: ;

#if defined(__amd64__)
	
	/* Macro for function parts define. */
	
	#define DO_SAVE_REG \
		sub $24, %rsp; \
		mov %rdx, 16(%rsp); /* 3rd argument */ \
		mov %rsi,  8(%rsp); /* 2nd argument */ \
		mov %rdi,   (%rsp); /* 1st argument */
	
	#define DO_LOAD_REG \
		mov   (%rsp), %rdi; /* 1st argument */ \
		mov  8(%rsp), %rsi; /* 2nd argument */ \
		mov 16(%rsp), %rdx; /* 3rd argument */ \
		add $24, %rsp;
	
	#define GET_HOOK_REC(header, ary_idx) \
		/* get and set override info */ ; \
		mov header##_hook@GOTPCREL(%rip), %r11; \
		lea ary_idx*64(%r11), %r11; /* 64=sizeof(THookFunctionInfo) */
	
	#define GET_SOURCE_FUNC(header, ary_idx) \
		GET_HOOK_REC(header, ary_idx)                            ; \
		mov 32(%r11), %rax; /* Original vfunc offset in entry. */ ; \
		push %rax;
	
	#define GET_ALL_FUNC_ADDR(header, ary_idx) \
		GET_HOOK_REC(header, ary_idx)                        ; \
		sub $16, %rsp; \
		movdqa 32(%r11), %xmm0; /* Copy Original&After func to XMM */ \
		movdqu %xmm0, (%rsp); /* Store Original&After func to stack */
	
	#define DO_CHECK_PERM(oop_reg_ofs) \
		mov is_in_permanent@GOTPCREL(%rip), %r11; \
		mov collectedHeap@GOTPCREL(%rip), %rdi;   \
		mov (%rdi), %rdi;                         \
		mov oop_reg_ofs(%rsp), %rsi;              \
		call *(%r11);                             \
		test %al, %al;                            \
	
	#define DO_JMP_OVERRIDE(func, oop_reg_ofs) \
		mov oop_reg_ofs(%rsp), %rdi;     \
		mov func##@GOTPCREL(%rip), %r11; \
		call *%r11;
	
	#define DO_JMP_ANY_FUNC(nextFunc) \
		pop %r11;        \
		test %r11, %r11; \
		jz nextFunc;     \
		call *%r11;
	
	/* Macro for override function define. */
	
	#define OVERRIDE_DEFINE(header, ary_idx, func, oop_reg_idx) \
		OVERRIDE_FUNC_DEFINE(header, ary_idx) \
		                                      \
		/* Save argument registers */         \
		DO_SAVE_REG                           \
		                                      \
		/* Get and set override info. */ ;    \
		GET_SOURCE_FUNC(header, ary_idx)      \
		                                      \
		/* Check permanent object. */ ;       \
		DO_CHECK_PERM(oop_reg_idx*8)          \
		jne .LORIGINAL_FUNC;                  \
		                                      \
		/* Call callback function. */ ;       \
		DO_JMP_OVERRIDE(func, oop_reg_idx*8)  \
		jmp .LORIGINAL_FUNC

	#ifdef AVX
	  #define CHECK_VTABLE(oop_reg, valid_caller) \
	    vmovq (oop_reg), %xmm0;                  \
	    vshufpd $0, %xmm0, %xmm1, %xmm1;         \
	    mov valid_caller##@GOTPCREL(%rip), %r11; \
	    vpcmpeqq (%r11), %xmm1, %xmm1;           \
	    vptest %xmm1, %xmm1;
	#elif defined SSE4_1
	  #define CHECK_VTABLE(oop_reg, valid_caller) \
	    movq (oop_reg), %xmm0;                   \
	    shufpd $0, %xmm0, %xmm1;                 \
	    mov valid_caller##@GOTPCREL(%rip), %r11; \
	    pcmpeqq (%r11), %xmm1;                   \
	    ptest %xmm1, %xmm1;
	#else
	  #define CHECK_VTABLE(oop_reg, valid_caller) \
	    mov (oop_reg), oop_reg;                  \
	    xor %rax, %rax;                          \
	    mov valid_caller##@GOTPCREL(%rip), %r11; \
	    cmp (%r11), oop_reg;                     \
	    cmove %r11, %rax;                        \
	    cmp 8(%r11), oop_reg;                    \
	    cmove %r11, %rax;                        \
	    test %rax, %rax;
	#endif
	
	#define OVERRIDE_DEFINE_WITH_CALLER_CHECK(header, ary_idx, func, oop_reg_idx, valid_caller) \
		OVERRIDE_FUNC_DEFINE(header, ary_idx)    \
		                                         \
		/* Save argument registers */            \
		DO_SAVE_REG                              \
		                                         \
		/* Get and set override info. */ ;       \
		GET_SOURCE_FUNC(header, ary_idx)         \
		                                         \
		/* Check vtable of caller */             \
		CHECK_VTABLE(%rdx, valid_caller);        \
		jz .LORIGINAL_FUNC;                      \
		                                         \
		/* Check permanent object. */ ;          \
		DO_CHECK_PERM(oop_reg_idx*8)             \
		jne .LORIGINAL_FUNC;                     \
		                                         \
		/* Call callback function. */ ;          \
		DO_JMP_OVERRIDE(func, oop_reg_idx*8)     \
		jmp .LORIGINAL_FUNC

	#define OVERRIDE_ADJ_DEFINE(header, ary_idx, func, oop_reg_idx) \
		OVERRIDE_FUNC_DEFINE(header, ary_idx) \
		                                      \
		/* Save argument registers */         \
		DO_SAVE_REG                           \
		                                      \
		/* Get and set override info. */ ;    \
		GET_SOURCE_FUNC(header, ary_idx)      \
		                                      \
		/* Check permanent object. */ ;       \
		DO_CHECK_PERM(oop_reg_idx*8)          \
		jz .LORIGINAL_FUNC;                   \
		                                      \
		/* Call callback function. */ ;       \
		DO_JMP_OVERRIDE(func, oop_reg_idx*8)  \
		jmp .LORIGINAL_FUNC
	
	#define OVERRIDE_CALLBACK_DEFINE(header, ary_idx, func) \
		OVERRIDE_FUNC_DEFINE(header, ary_idx)      \
		                                           \
		/* Get all override info. */ ;             \
		GET_ALL_FUNC_ADDR(header, ary_idx)         \
		                                           \
		/* Save argument registers */              \
		DO_SAVE_REG                                \
		                                           \
		/* Call before callback with 2nd arg. */ ; \
		DO_JMP_OVERRIDE(func, 8)                   \
		                                           \
		                                           \
		/* call callback target */                 \
		DO_LOAD_REG                                \
		pop %r11;                                  \
		callq *%r11;                               \
		                                           \
		/* After Callback */                       \
		DO_JMP_ANY_FUNC(.RETURN_CALLER_FUNC)       \
		                                           \
		/* Return to caller */                     \
		jmp .RETURN_CALLER_FUNC
	
	/* Macro for hook each target function. */
	
	#define OVERRIDE_DO_BLK_CAREFUL(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForSweep, 2)
	#define OVERRIDE_OOP_FOLLOW_CONTENTS(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForParallel, 2)
	#define OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForParOld, 3)
	#define OVERRIDE_OOP_OOP_ITERATE(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForIterate, 2)
	#define OVERRIDE_OOP_OOP_ITERATE_WITH_CALLER_CHECK(header, ary_idx, valid_caller) \
		OVERRIDE_DEFINE_WITH_CALLER_CHECK(header, ary_idx, callbackForIterate, 2, valid_caller)
	
	#define OVERRIDE_OOP_PAR_ADJUST(header, ary_idx) \
		OVERRIDE_ADJ_DEFINE(header, ary_idx, callbackForAdjustPtr, 2)
	#define OVERRIDE_OOP_DO_ADDR(header, ary_idx) \
		OVERRIDE_ADJ_DEFINE(header, ary_idx, callbackForDoAddr, 2)
	#define OVERRIDE_OOP_UPDATE_PTR(header, ary_idx) \
		OVERRIDE_ADJ_DEFINE(header, ary_idx, callbackForUpdatePtr, 3)
	
	#define OVERRIDE_JVMTI_ITERATE(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForJvmtiIterate, 2)
	
#elif defined(__i386__)
	
	#ifdef __i686
		/*
		 * This statement is for avoiding illegal conversion by preprocceor.
		 * before : "call __i686.get_pc_thunk.bx;"
		 * after  : "call 1.get_pc_thunk.bx;"
		 */
		#undef __i686
		#define AVOID__i686
	#endif
	
	/* Macro for function parts define. */
	
        #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)
                #define GET_GOT_ADDR \
                        push %ebx;                         \
                        call __x86.get_pc_thunk.bx;       \
                        addl $_GLOBAL_OFFSET_TABLE_, %ebx;
        #else
                #define GET_GOT_ADDR \
                        push %ebx;                         \
                        call __i686.get_pc_thunk.bx;       \
                        addl $_GLOBAL_OFFSET_TABLE_, %ebx;
        #endif
	
	#define GET_HOOK_REC(header, ary_idx)      \
		mov header##_hook@GOT(%ebx), %ecx; \
		lea ary_idx*28(%ecx), %ecx; /* 28=sizeof(THookFunctionInfo) */

	#define GET_SOURCE_FUNC(header, ary_idx) \
		GET_HOOK_REC(header, ary_idx)                                 \
		mov 16(%ecx), %eax;    /* original hook offset in entry. */ ; \
		push %eax;
	
	#define DO_CHECK_PERM(oop_reg) \
		mov (oop_reg)+12(%esp), %edx;           \
		mov is_in_permanent@GOTOFF(%ebx), %ecx; \
		mov collectedHeap@GOTOFF(%ebx), %eax;   \
		push %edx;                              \
		push %eax;                              \
		call *%ecx;                             \
		                                        \
		/* We recover 1 stack only.             \
		   Others (oop), we will recover in .LORIGINAL_FUNC . */ \
		addl $0x4, %esp;                        \
		                                        \
		test %al, %al;
	
	#define DO_JMP_OVERRIDE(func) \
		mov func##@GOT(%ebx), %edx; \
		call *%edx;

	#define GET_NEXT_JMP_FUNC(header, ary_idx, offset) \
	        GET_HOOK_REC(header, ary_idx) \
		mov offset(%ecx), %edx;       \
		test %edx, %edx;
	
	/* Macro for override function define. */
	
	#define OVERRIDE_DEFINE(header, ary_idx, func, oop_reg) \
		OVERRIDE_FUNC_DEFINE(header, ary_idx) \
		                                      \
		/* Get GOT base address. */ ;         \
		GET_GOT_ADDR                          \
		                                      \
		/* get and set override info */ ;     \
		GET_SOURCE_FUNC(header, ary_idx)      \
		                                      \
		/* Check permanent object. */ ;       \
		DO_CHECK_PERM(oop_reg)                \
		jne .LORIGINAL_FUNC;                  \
		                                      \
		/* Call callback function. */ ;       \
		DO_JMP_OVERRIDE(func)                 \
		jmp .LORIGINAL_FUNC;

	#ifdef AVX
	  #define CHECK_VTABLE(oop_reg, valid_caller) \
            vmovd (oop_reg), %xmm0;             \
	    vpshufd $0, %xmm0, %xmm1;           \
	    mov valid_caller##@GOT(%ebx), %ecx; \
	    vmovq (%ecx), %xmm1;                \
	    vpcmpeqd %xmm0, %xmm1, %xmm1;       \
	    vptest %xmm1, %xmm1;
	#elif defined SSE4_1
	  #define CHECK_VTABLE(oop_reg, valid_caller) \
            movd (oop_reg), %xmm0;              \
	    pshufd $0, %xmm0, %xmm1;            \
	    mov valid_caller##@GOT(%ebx), %ecx; \
	    movq (%ecx), %xmm1;                 \
	    pcmpeqd %xmm0, %xmm1;               \
	    ptest %xmm1, %xmm1;
	#else
	  #define CHECK_VTABLE(oop_reg, valid_caller) \
	    mov (oop_reg), oop_reg;             \
	    xor %edx, %edx;                     \
	    mov valid_caller##@GOT(%ebx), %ecx; \
	    cmp (%ecx), oop_reg;                \
	    cmove %ecx, %edx;                   \
	    cmp 4(%ecx), oop_reg;               \
	    cmove %ecx, %edx;                   \
	    test %edx, %edx;
	#endif

	#define OVERRIDE_DEFINE_WITH_CALLER_CHECK(header, ary_idx, func, oop_reg, valid_caller) \
		OVERRIDE_FUNC_DEFINE(header, ary_idx) \
		                                      \
		/* Get GOT base address. */ ;         \
		GET_GOT_ADDR                          \
		                                      \
		/* get and set override info */ ;     \
		GET_SOURCE_FUNC(header, ary_idx)      \
		                                      \
		/* Get 3rd arg (OopClosure) */        \
		mov 20(%esp), %eax;                   \
		                                      \
		/* Dummy stack for jmp */             \
		subl $4, %esp;                        \
		/* Check vtable of caller */          \
		CHECK_VTABLE(%eax, valid_caller);     \
		jz .LORIGINAL_FUNC;                   \
		addl $4, %esp;                        \
		                                      \
		/* Check permanent object. */ ;       \
		DO_CHECK_PERM(oop_reg)                \
		jne .LORIGINAL_FUNC;                  \
		                                      \
		/* Call callback function. */ ;       \
		DO_JMP_OVERRIDE(func)                 \
		jmp .LORIGINAL_FUNC;
	
	#define OVERRIDE_ADJ_DEFINE(header, ary_idx, func, oop_reg) \
		OVERRIDE_FUNC_DEFINE(header, ary_idx) \
		                                      \
		/* Get GOT base address. */ ;         \
		GET_GOT_ADDR                          \
		                                      \
		/* get and set override info */ ;     \
		GET_SOURCE_FUNC(header, ary_idx)      \
		                                      \
		/* Check permanent object. */ ;       \
		DO_CHECK_PERM(oop_reg)                \
		jz .LORIGINAL_FUNC;                   \
		                                      \
		/* Call callback function. */ ;       \
		DO_JMP_OVERRIDE(func)                 \
		jmp .LORIGINAL_FUNC;

	#ifdef AVX
	  #define REPUSH_ARGS \
	    vmovq 8(%esp), %xmm0; \
	    sub $8, %esp;         \
	    vmovq %xmm0, (%esp);
	#elif defined SSE2
	  #define REPUSH_ARGS \
	    movq 8(%esp), %xmm0; \
	    sub $8, %esp;        \
	    movq %xmm0, (%esp);
	#else
	  #define REPUSH_ARGS \
	    mov  8(%esp), %eax; /* arg1 */ \
	    mov 12(%esp), %ecx; /* arg2 */ \
	    sub $8, %esp;                  \
	    mov %ecx, 4(%esp);             \
	    mov %eax, (%esp);
	#endif
	
	#define OVERRIDE_CALLBACK_DEFINE(header, ary_idx, func) \
		OVERRIDE_FUNC_DEFINE(header, ary_idx)   \
		                                        \
		/* Get GOT base address. */ ;           \
		GET_GOT_ADDR                            \
		                                        \
		/* Get 2nd argument. */ ;               \
		mov 12(%esp), %eax;                     \
		push %eax                               \
		/* Call before callback function. */ ;  \
		DO_JMP_OVERRIDE(func)                   \
		/* Remove 1st argument from stack. */ ; \
		addl $0x4, %esp;                        \
		                                        \
		/* Get callback target. */ ;            \
		GET_NEXT_JMP_FUNC(header, ary_idx, 16)  \
		/* push original arguments to stack. */ \
		/* call override target. */ ;           \
		REPUSH_ARGS                             \
		call *%edx;                             \
		add $8, %esp;                           \
		                                        \
		/* Get after callback. */ ;             \
		GET_NEXT_JMP_FUNC(header, ary_idx, 20)  \
		                                        \
		/* null check for callback. */ ;        \
		jz .RETURN_CALLER_FUNC;                 \
		                                        \
		/* Call after callback. */              \
		call *%edx;                             \
		jmp .RETURN_CALLER_FUNC;
	
	/* Macro for hook each target function. */
	
	#define OVERRIDE_DO_BLK_CAREFUL(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForSweep, 4)
	#define OVERRIDE_OOP_FOLLOW_CONTENTS(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForParallel, 4)
	#define OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForParOld, 8)
	#define OVERRIDE_OOP_OOP_ITERATE(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForIterate, 4)
	#define OVERRIDE_OOP_OOP_ITERATE_WITH_CALLER_CHECK(header, ary_idx, valid_caller) \
		OVERRIDE_DEFINE_WITH_CALLER_CHECK(header, ary_idx, callbackForIterate, 4, valid_caller)
	#define OVERRIDE_OOP_PAR_ADJUST(header, ary_idx) \
		OVERRIDE_ADJ_DEFINE(header, ary_idx, callbackForAdjustPtr, 4)
	#define OVERRIDE_OOP_DO_ADDR(header, ary_idx) \
		OVERRIDE_ADJ_DEFINE(header, ary_idx, callbackForDoAddr, 4)
	#define OVERRIDE_OOP_UPDATE_PTR(header, ary_idx) \
		OVERRIDE_ADJ_DEFINE(header, ary_idx, callbackForUpdatePtr, 8)
	
	#define OVERRIDE_JVMTI_ITERATE(header, ary_idx) \
		OVERRIDE_DEFINE(header, ary_idx, callbackForJvmtiIterate, 4)
	
#endif

/* Begin of .text section. */
	.text

.LORIGINAL_FUNC:
#if defined(__amd64__)
	pop %r11
	DO_LOAD_REG
	jmp *%r11
#elif defined(__i386__)
	addl $0x4, %esp
	pop %ecx
	pop %ebx
	jmp *%ecx
#endif


.RETURN_CALLER_FUNC:
#if defined(__amd64__)
	/* Return caller. Return address exists on top of stack. */
	/* We need to pop return address from stack. */
	pop %r11
	jmp *%r11
#elif defined(__i386__)
	/* restore %ebx & stack */
	pop %ebx;

	/* Return caller. */ ;
	pop %edx;
	jmp *%edx;
#endif


/* Override definition. */

/* For Parallel. */

/* instanceKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(par, 0)
/* objArrayKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(par, 1)
/* typeArrayKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(par, 2)
/* instanceRefKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(par, 3)


/* For Parallel (CR6964458). */

/* InstanceKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR6964458_par, 0)
/* objArrayKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR6964458_par, 1)
/* typeArrayKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR6964458_par, 2)
/* InstanceRefKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR6964458_par, 3)
/* InstanceClassLoaderKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR6964458_par, 4)


/* For Parallel (CR8000213). */

/* InstanceKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR8000213_par, 0)
/* ObjArrayKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR8000213_par, 1)
/* TypeArrayKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR8000213_par, 2)
/* InstanceRefKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR8000213_par, 3)
/* InstanceClassLoaderKlass::oop_follow_contents(oopDesc*) */
OVERRIDE_OOP_FOLLOW_CONTENTS(CR8000213_par, 4)


/* For ParallelOld. */

/* instanceKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(parOld, 0)
/* objArrayKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(parOld, 1)
/* typeArrayKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(parOld, 2)
/* instanceRefKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(parOld, 3)


/* For ParallelOld (CR6964458). */

/* InstanceKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR6964458_parOld, 0)
/* objArrayKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR6964458_parOld, 1)
/* typeArrayKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR6964458_parOld, 2)
/* InstanceRefKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR6964458_parOld, 3)
/* InstanceClassLoaderKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR6964458_parOld, 4)


/* For ParallelOld (CR8000213). */

/* InstanceKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR8000213_parOld, 0)
/* ObjArrayKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR8000213_parOld, 1)
/* TypeArrayKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR8000213_parOld, 2)
/* InstanceRefKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR8000213_parOld, 3)
/* InstanceClassLoaderKlass::oop_follow_contents(ParCompactionManager*, oopDesc*) */
OVERRIDE_PAR_OOP_FOLLOW_CONTENTS(CR8000213_parOld, 4)


/* For CMS. */
/*
 * We want to hook sweep phase
 * and around "ContiguousSpace::par_oop_iterate()".
 */

/* SweepClosure::do_blk_careful(HeapWord*) */
OVERRIDE_DO_BLK_CAREFUL(cms_sweep, 0)

/* instanceKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(cms_new, 0)
/* objArrayKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(cms_new, 1)
/* typeArrayKlass::oop_oop_iterate(oopDesc*, OopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(cms_new, 2)
/* instanceRefKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(cms_new, 3)

/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) for after CR6964458 */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_cms_new, 0)
/* objArrayKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) for after CR6964458 */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_cms_new, 1)
/* typeArrayKlass::oop_oop_iterate(oopDesc*, OopClosure*) for after CR6964458 */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_cms_new, 2)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) for after CR6964458 */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_cms_new, 3)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_cms_new, 4)

/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) for after CR8000213 */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_cms_new, 0)
/* ObjArrayKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) for after CR8000213 */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_cms_new, 1)
/* TypeArrayKlass::oop_oop_iterate(oopDesc*, OopClosure*) for after CR8000213 */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_cms_new, 2)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) for after CR8000213 */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_cms_new, 3)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, Par_MarkRefsIntoAndScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_cms_new, 4)


/* For G1. */

/* initial-mark */
/* G1ParScanAndMarkExtRootClosure::do_oop(oopDesc**) */
/* G1ParCopyClosure<false, (G1Barrier)0, false>::do_oop(oopDesc**) */
OVERRIDE_CALLBACK_DEFINE(g1, 0, callbackForDoOop);
/* G1ParScanAndMarkExtRootClosure::do_oop(unsigned int*) */
/* G1ParCopyClosure<false, (G1Barrier)0, false>::do_oop(unsigned int*) */
OVERRIDE_CALLBACK_DEFINE(g1, 1, callbackForDoNarrowOop);

/* concurrent-root-region-scan */
/* instanceKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(g1, 2)
/* objArrayKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(g1, 3)
/* instanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(g1, 4)

/* concurrent-mark / remark */
/* instanceKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(g1, 5)
/* objArrayKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(g1, 6)
/* typeArrayKlass::oop_oop_iterate(oopDesc*, OopClosure*) */
OVERRIDE_OOP_OOP_ITERATE_WITH_CALLER_CHECK(g1, 7, VTableForTypeArrayOopClosure)
/* instanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(g1, 8)

/* For G1 (CR6964458). */

/* initial-mark */
/* G1ParScanAndMarkExtRootClosure::do_oop(oopDesc**) */
/* G1ParCopyClosure<false, (G1Barrier)0, false>::do_oop(oopDesc**) */
OVERRIDE_CALLBACK_DEFINE(CR6964458_g1, 0, callbackForDoOop);
/* G1ParScanAndMarkExtRootClosure::do_oop(unsigned int*) */
/* G1ParCopyClosure<false, (G1Barrier)0, false>::do_oop(unsigned int*) */
OVERRIDE_CALLBACK_DEFINE(CR6964458_g1, 1, callbackForDoNarrowOop);

/* concurrent-root-region-scan */
/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_g1, 2)
/* objArrayKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_g1, 3)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_g1, 4)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_g1, 5)

/* concurrent-mark / remark */
/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_g1, 6)
/* objArrayKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_g1, 7)
/* typeArrayKlass::oop_oop_iterate(oopDesc*, ExtendedOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE_WITH_CALLER_CHECK(CR6964458_g1, 8, VTableForTypeArrayOopClosure)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_g1, 9)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR6964458_g1, 10)

/* For G1 (CR8000213). */

/* initial-mark */
/* G1ParScanAndMarkExtRootClosure::do_oop(oopDesc**) */
/* G1ParCopyClosure<false, (G1Barrier)0, false>::do_oop(oopDesc**) */
OVERRIDE_CALLBACK_DEFINE(CR8000213_g1, 0, callbackForDoOop);
/* G1ParScanAndMarkExtRootClosure::do_oop(unsigned int*) */
/* G1ParCopyClosure<false, (G1Barrier)0, false>::do_oop(unsigned int*) */
OVERRIDE_CALLBACK_DEFINE(CR8000213_g1, 1, callbackForDoNarrowOop);

/* concurrent-root-region-scan */
/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_g1, 2)
/* objArrayKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_g1, 3)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_g1, 4)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_g1, 5)

/* concurrent-mark / remark */
/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_g1, 6)
/* ObjArrayKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_g1, 7)
/* TypeArrayKlass::oop_oop_iterate(oopDesc*, ExtendedOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE_WITH_CALLER_CHECK(CR8000213_g1, 8, VTableForTypeArrayOopClosure)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_g1, 9)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8000213_g1, 10)

/* For G1 (CR8027746). */

/* initial-mark */
/* G1ParScanAndMarkExtRootClosure::do_oop(oopDesc**) */
/* G1ParCopyClosure<false, (G1Barrier)0, false>::do_oop(oopDesc**) */
OVERRIDE_CALLBACK_DEFINE(CR8027746_g1, 0, callbackForDoOop);
/* G1ParScanAndMarkExtRootClosure::do_oop(unsigned int*) */
/* G1ParCopyClosure<false, (G1Barrier)0, false>::do_oop(unsigned int*) */
OVERRIDE_CALLBACK_DEFINE(CR8027746_g1, 1, callbackForDoNarrowOop);

/* concurrent-root-region-scan */
/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8027746_g1, 2)
/* objArrayKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8027746_g1, 3)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8027746_g1, 4)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8027746_g1, 5)

/* concurrent-mark / remark */
/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8027746_g1, 6)
/* ObjArrayKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8027746_g1, 7)
/* TypeArrayKlass::oop_oop_iterate(oopDesc*, ExtendedOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE_WITH_CALLER_CHECK(CR8027746_g1, 8, VTableForTypeArrayOopClosure)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8027746_g1, 9)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8027746_g1, 10)

/* For G1 (JDK-8049421). */

/* initial-mark */
/* G1ParScanAndMarkExtRootClosure::do_oop(oopDesc**) */
/* G1ParCopyClosure<(G1Barrier)0, G1MarkFromRoot>::do_oop(oopDesc**) */
OVERRIDE_CALLBACK_DEFINE(CR8049421_g1, 0, callbackForDoOop);
/* G1ParScanAndMarkExtRootClosure::do_oop(unsigned int*) */
/* G1ParCopyClosure<(G1Barrier)0, G1MarkFromRoot>::do_oop(unsigned int*) */
OVERRIDE_CALLBACK_DEFINE(CR8049421_g1, 1, callbackForDoNarrowOop);

/* concurrent-root-region-scan */
/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8049421_g1, 2)
/* objArrayKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8049421_g1, 3)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8049421_g1, 4)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, G1RootRegionScanClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8049421_g1, 5)

/* concurrent-mark / remark */
/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8049421_g1, 6)
/* ObjArrayKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8049421_g1, 7)
/* TypeArrayKlass::oop_oop_iterate(oopDesc*, ExtendedOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE_WITH_CALLER_CHECK(CR8049421_g1, 8, VTableForTypeArrayOopClosure)
/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8049421_g1, 9)
/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, G1CMOopClosure*) */
OVERRIDE_OOP_OOP_ITERATE(CR8049421_g1, 10)

/* G1 events */

/* CMCleanUp::do_void() */
OVERRIDE_CALLBACK_DEFINE(g1Event, 0, callbackForG1Cleanup);
/* G1CollectedHeap::gc_prologue() */
OVERRIDE_CALLBACK_DEFINE(g1Event, 1, callbackForG1Full);
/* G1CollectedHeap::gc_epilogue() */
OVERRIDE_CALLBACK_DEFINE(g1Event, 2, callbackForG1FullReturn);

/* for Klass relocation. */

/* instanceKlassKlass::oop_adjust_pointers(oopDesc*) */
OVERRIDE_OOP_PAR_ADJUST(adj, 0)
/* objArrayKlassKlass::oop_adjust_pointers(oopDesc*) */
OVERRIDE_OOP_PAR_ADJUST(adj, 1)
/* arrayKlassKlass::oop_adjust_pointers(oopDesc*) */
OVERRIDE_OOP_PAR_ADJUST(adj, 2)

/* for Klass relocation if use ParallelOldGC. */

/* MoveAndUpdateClosure::do_addr(HeapWord*, unsigned long) */
OVERRIDE_OOP_DO_ADDR(adj, 3)

/* UpdateOnlyClosure::do_addr(HeapWord*, size_t) */
OVERRIDE_OOP_DO_ADDR(adj, 4)

/* instanceKlassKlass::oop_update_pointers(ParCompactionManager*, oopDesc*) */
OVERRIDE_OOP_UPDATE_PTR(adj, 5)
/* objArrayKlassKlass::oop_update_pointers(ParCompactionManager*, oopDesc*) */
OVERRIDE_OOP_UPDATE_PTR(adj, 6)
/* arrayKlassKlass::oop_update_pointers(ParCompactionManager*, oopDesc*) */
OVERRIDE_OOP_UPDATE_PTR(adj, 7)

/* for JVMTI IterateOverHeap. */

/* IterateOverHeapObjectClosure::do_object(oop o) */
OVERRIDE_JVMTI_ITERATE(jvmti, 0)

/* For inner GC start. */

/* ParallelScavengeHeap::accumulate_statistics_all_tlabs(void) */
OVERRIDE_CALLBACK_DEFINE(innerStart, 0, callbackForInnerGCStart)
/* CollectedHeap::accumulate_statistics_all_tlabs(void) */
OVERRIDE_CALLBACK_DEFINE(innerStart, 1, callbackForInnerGCStart)
/* GenCollectedHeap::gc_prologue(bool) */
OVERRIDE_CALLBACK_DEFINE(innerStart, 2, callbackForInnerGCStart)

/* For WatcherThread */
/* WatcherThread::run() */
OVERRIDE_CALLBACK_DEFINE(watcherThread, 0, callbackForWatcherThreadRun)


#ifdef AVOID__i686
	/* Define again. */
	#undef AVOID__i686
	#define __i686
#endif