hotspot/src/cpu/x86/vm/dump_x86_64.cpp

Print this page
rev 611 : Merge
   1 #ifdef USE_PRAGMA_IDENT_SRC
   2 #pragma ident "@(#)dump_x86_64.cpp      1.13 07/09/17 09:25:59 JVM"
   3 #endif
   4 /*
   5  * Copyright 2004-2007 Sun Microsystems, Inc.  All Rights Reserved.
   6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   7  *
   8  * This code is free software; you can redistribute it and/or modify it
   9  * under the terms of the GNU General Public License version 2 only, as
  10  * published by the Free Software Foundation.
  11  *
  12  * This code is distributed in the hope that it will be useful, but WITHOUT
  13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15  * version 2 for more details (a copy is included in the LICENSE file that
  16  * accompanied this code).
  17  *
  18  * You should have received a copy of the GNU General Public License version
  19  * 2 along with this work; if not, write to the Free Software Foundation,
  20  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  21  *
  22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  23  * CA 95054 USA or visit www.sun.com if you need additional information or
  24  * have any questions.
  25  *  


  76   Label common_code;
  77   for (int i = 0; i < vtbl_list_size; ++i) {
  78     for (int j = 0; j < num_virtuals; ++j) {
  79       dummy_vtable[num_virtuals * i + j] = (void*)masm->pc();
  80 
  81       // Load eax with a value indicating vtable/offset pair.
  82       // -- bits[ 7..0]  (8 bits) which virtual method in table?
  83       // -- bits[12..8]  (5 bits) which virtual method table?
  84       // -- must fit in 13-bit instruction immediate field.
  85       __ movl(rax, (i << 8) + j);
  86       __ jmp(common_code);
  87     }
  88   }
  89 
  90   __ bind(common_code);
  91 
  92   // Expecting to be called with "thiscall" convections -- the arguments
  93   // are on the stack and the "this" pointer is in c_rarg0. In addition, rax
  94   // was set (above) to the offset of the method in the table.
  95 
  96   __ pushq(c_rarg1);                    // save & free register
  97   __ pushq(c_rarg0);                    // save "this"
  98   __ movq(c_rarg0, rax);
  99   __ shrq(c_rarg0, 8);                  // isolate vtable identifier.
 100   __ shlq(c_rarg0, LogBytesPerWord);
 101   __ lea(c_rarg1, ExternalAddress((address)vtbl_list)); // ptr to correct vtable list.
 102   __ addq(c_rarg1, c_rarg0);            // ptr to list entry.
 103   __ movq(c_rarg1, Address(c_rarg1, 0));        // get correct vtable address.
 104   __ popq(c_rarg0);                     // restore "this"
 105   __ movq(Address(c_rarg0, 0), c_rarg1);        // update vtable pointer.
 106 
 107   __ andq(rax, 0x00ff);                 // isolate vtable method index
 108   __ shlq(rax, LogBytesPerWord);
 109   __ addq(rax, c_rarg1);                // address of real method pointer.
 110   __ popq(c_rarg1);                     // restore register.
 111   __ movq(rax, Address(rax, 0));        // get real method pointer.
 112   __ jmp(rax);                          // jump to the real method.
 113 
 114   __ flush();
 115 
 116   *mc_top = (char*)__ pc();
 117 }
 118 



   1 /*
   2  * Copyright 2004-2008 Sun Microsystems, Inc.  All Rights Reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  20  * CA 95054 USA or visit www.sun.com if you need additional information or
  21  * have any questions.
  22  *


  73   Label common_code;
  74   for (int i = 0; i < vtbl_list_size; ++i) {
  75     for (int j = 0; j < num_virtuals; ++j) {
  76       dummy_vtable[num_virtuals * i + j] = (void*)masm->pc();
  77 
  78       // Load eax with a value indicating vtable/offset pair.
  79       // -- bits[ 7..0]  (8 bits) which virtual method in table?
  80       // -- bits[12..8]  (5 bits) which virtual method table?
  81       // -- must fit in 13-bit instruction immediate field.
  82       __ movl(rax, (i << 8) + j);
  83       __ jmp(common_code);
  84     }
  85   }
  86 
  87   __ bind(common_code);
  88 
  89   // Expecting to be called with "thiscall" convections -- the arguments
  90   // are on the stack and the "this" pointer is in c_rarg0. In addition, rax
  91   // was set (above) to the offset of the method in the table.
  92 
  93   __ push(c_rarg1);                     // save & free register
  94   __ push(c_rarg0);                     // save "this"
  95   __ mov(c_rarg0, rax);
  96   __ shrptr(c_rarg0, 8);                // isolate vtable identifier.
  97   __ shlptr(c_rarg0, LogBytesPerWord);
  98   __ lea(c_rarg1, ExternalAddress((address)vtbl_list)); // ptr to correct vtable list.
  99   __ addptr(c_rarg1, c_rarg0);          // ptr to list entry.
 100   __ movptr(c_rarg1, Address(c_rarg1, 0));      // get correct vtable address.
 101   __ pop(c_rarg0);                      // restore "this"
 102   __ movptr(Address(c_rarg0, 0), c_rarg1);      // update vtable pointer.
 103 
 104   __ andptr(rax, 0x00ff);                       // isolate vtable method index
 105   __ shlptr(rax, LogBytesPerWord);
 106   __ addptr(rax, c_rarg1);              // address of real method pointer.
 107   __ pop(c_rarg1);                      // restore register.
 108   __ movptr(rax, Address(rax, 0));      // get real method pointer.
 109   __ jmp(rax);                          // jump to the real method.
 110 
 111   __ flush();
 112 
 113   *mc_top = (char*)__ pc();
 114 }