generateJvmOffsets.cpp revision 3602:da91efe96a93
174517Sru/*
274517Sru * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
374517Sru * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
474462Salfred *
574517Sru * This code is free software; you can redistribute it and/or modify it
674517Sru * under the terms of the GNU General Public License version 2 only, as
774517Sru * published by the Free Software Foundation.
874517Sru *
974517Sru * This code is distributed in the hope that it will be useful, but WITHOUT
1074517Sru * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1174517Sru * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1274517Sru * version 2 for more details (a copy is included in the LICENSE file that
1374517Sru * accompanied this code).
1474517Sru *
1574517Sru * You should have received a copy of the GNU General Public License version
1674517Sru * 2 along with this work; if not, write to the Free Software Foundation,
1774517Sru * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1874517Sru *
1974517Sru * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2074517Sru * or visit www.oracle.com if you need additional information or have any
2174517Sru * questions.
2274517Sru *
2374517Sru */
2474517Sru
2574517Sru/*
2674517Sru * This is to provide sanity check in jhelper.d which compares SCCS
2774517Sru * versions of generateJvmOffsets.cpp used to create and extract
2874517Sru * contents of __JvmOffsets[] table.
2974517Sru * The __JvmOffsets[] table is located in generated JvmOffsets.cpp.
3074517Sru *
3174517Sru * GENOFFS_SCCS_VER 34
3284487Swpaul */
3374517Sru
3474517Sru#include "generateJvmOffsets.h"
3574517Sru
3674517Sru/* A workaround for private and protected fields */
3774517Sru#define private   public
3874517Sru#define protected public
3974517Sru
4074517Sru// not on macosx #include <proc_service.h>
4174517Sru#include "code/codeBlob.hpp"
4274517Sru#include "code/nmethod.hpp"
4374517Sru#include "code/pcDesc.hpp"
4474517Sru#include "gc_interface/collectedHeap.hpp"
4574517Sru#include "memory/heap.hpp"
4674517Sru#include "memory/memRegion.hpp"
4774517Sru#include "memory/universe.hpp"
4874517Sru#include "oops/constMethod.hpp"
4974517Sru#include "oops/klass.hpp"
5074517Sru#include "oops/method.hpp"
5174517Sru#include "oops/oop.hpp"
5274517Sru#include "oops/symbol.hpp"
5374517Sru#include "runtime/virtualspace.hpp"
5474517Sru#include "runtime/vmStructs.hpp"
5574517Sru#include "utilities/accessFlags.hpp"
5674517Sru#include "utilities/globalDefinitions.hpp"
5774517Sru
5874517Sru// These are defined somewhere for Solaris
5974517Sru#define PR_MODEL_ILP32 1
6084487Swpaul#define PR_MODEL_LP64  2
6174517Sru
6284487Swpaul#ifdef COMPILER1
6374517Sru#if defined(DEBUG) || defined(FASTDEBUG)
6474517Sru
6574517Sru/*
6674517Sru * To avoid the most part of potential link errors
6774517Sru * we link this program with -z nodefs .
6874517Sru *
6974517Sru * But for 'debug1' and 'fastdebug1' we still have to provide
7074517Sru * a particular workaround for the following symbols bellow.
7174517Sru * It will be good to find out a generic way in the future.
7274517Sru */
7374517Sru
7474517Sru#pragma weak tty
7574517Sru#pragma weak CMSExpAvgFactor
7674517Sru
7774517Sru#if defined(i386) || defined(__i386) || defined(__amd64)
7884306Sru#pragma weak noreg
7974517Sru#endif /* i386 */
8074517Sru
8174517SruLIR_Opr LIR_OprFact::illegalOpr = (LIR_Opr) 0;
8274517Sru
8374517Sruaddress StubRoutines::_call_stub_return_address = NULL;
8474517Sru
8574517SruStubQueue* AbstractInterpreter::_code = NULL;
8674517Sru
8774517Sru#endif /* defined(DEBUG) || defined(FASTDEBUG) */
8874517Sru#endif /* COMPILER1 */
8974517Sru
9074517Sru#define GEN_OFFS(Type,Name)                             \
9174517Sru  switch(gen_variant) {                                 \
9274517Sru  case GEN_OFFSET:                                      \
9374517Sru    printf("#define OFFSET_%-33s %ld\n",                 \
9474517Sru           #Type #Name, offset_of(Type, Name)); \
9574517Sru    break;                                              \
9674462Salfred  case GEN_INDEX:                                       \
9774462Salfred    printf("#define IDX_OFFSET_%-33s %d\n",             \
9874462Salfred            #Type #Name, index++);                      \
9974462Salfred    break;                                              \
10074462Salfred  case GEN_TABLE:                                       \
10174462Salfred    printf("\tOFFSET_%s,\n", #Type #Name);              \
10274462Salfred    break;                                              \
10374462Salfred  }
10474517Sru
10574517Sru#define GEN_SIZE(Type)                                  \
10674517Sru  switch(gen_variant) {                                 \
10774517Sru  case GEN_OFFSET:                                      \
10874517Sru    printf("#define SIZE_%-35s %ld\n",                   \
10974517Sru            #Type, sizeof(Type));                       \
11074517Sru    break;                                              \
11174517Sru  case GEN_INDEX:                                       \
11274517Sru    printf("#define IDX_SIZE_%-35s %d\n",               \
11374517Sru            #Type, index++);                            \
114233557Sjoel    break;                                              \
11574517Sru  case GEN_TABLE:                                       \
11674517Sru    printf("\tSIZE_%s,\n", #Type);                      \
11774517Sru    break;                                              \
11874517Sru  }
11974517Sru
12074517Sru#define GEN_VALUE(String,Value)                         \
12174517Sru  switch(gen_variant) {                                 \
12274517Sru  case GEN_OFFSET:                                      \
12374462Salfred    printf("#define %-40s %d\n", #String, Value);       \
12474517Sru    break;                                              \
12574462Salfred  case GEN_INDEX:                                       \
12674517Sru    printf("#define IDX_%-40s %d\n", #String, index++); \
12774517Sru    break;                                              \
12874517Sru  case GEN_TABLE:                                       \
12974462Salfred    printf("\t" #String ",\n");                         \
13074517Sru    break;                                              \
13174517Sru  }
13274517Sru
13374517Sruvoid gen_prologue(GEN_variant gen_variant) {
13474517Sru    const char *suffix;
13574517Sru
13674517Sru    switch(gen_variant) {
13774517Sru      case GEN_OFFSET: suffix = ".h";        break;
13874517Sru      case GEN_INDEX:  suffix = "Index.h";   break;
13974517Sru      case GEN_TABLE:  suffix = ".cpp";      break;
14074517Sru    }
14174462Salfred
14274517Sru    printf("/*\n");
14374517Sru    printf(" * JvmOffsets%s !!!DO NOT EDIT!!! \n", suffix);
14474462Salfred    printf(" * The generateJvmOffsets program generates this file!\n");
14574517Sru    printf(" */\n\n");
14674517Sru    switch(gen_variant) {
14774517Sru
14874517Sru      case GEN_OFFSET:
14974517Sru      case GEN_INDEX:
15074517Sru        break;
151241181Spfg
15274517Sru      case GEN_TABLE:
15374517Sru        printf("#include \"JvmOffsets.h\"\n");
15474462Salfred        printf("\n");
15574517Sru        printf("int __JvmOffsets[] = {\n");
15674462Salfred        break;
15774517Sru    }
15874462Salfred}
159108087Sru
16074517Sruvoid gen_epilogue(GEN_variant gen_variant) {
161108087Sru    if (gen_variant != GEN_TABLE) {
16274462Salfred        return;
16374462Salfred    }
16474517Sru    printf("};\n\n");
16574517Sru    return;
16674517Sru}
16774517Sru
16874517Sruint generateJvmOffsets(GEN_variant gen_variant) {
16974462Salfred  int index = 0;        /* It is used to generate JvmOffsetsIndex.h */
17074517Sru  int pointer_size = sizeof(void *);
17174462Salfred  int data_model = (pointer_size == 4) ? PR_MODEL_ILP32 : PR_MODEL_LP64;
17274462Salfred
17374517Sru  gen_prologue(gen_variant);
17474517Sru
17574517Sru  GEN_VALUE(DATA_MODEL, data_model);
17674517Sru  GEN_VALUE(POINTER_SIZE, pointer_size);
17774517Sru#if defined(TIERED)
17874517Sru  GEN_VALUE(COMPILER, 3);
17974517Sru#elif COMPILER1
18074517Sru  GEN_VALUE(COMPILER, 1);
18174462Salfred#elif COMPILER2
18274517Sru  GEN_VALUE(COMPILER, 2);
183108087Sru#else
18474517Sru  GEN_VALUE(COMPILER, 0);
18574517Sru#endif // COMPILER1 && COMPILER2
18684425Sbde  printf("\n");
18774517Sru
18874517Sru  GEN_OFFS(CollectedHeap, _reserved);
18974517Sru  GEN_OFFS(MemRegion, _start);
19074517Sru  GEN_OFFS(MemRegion, _word_size);
19174517Sru  GEN_SIZE(HeapWord);
19274517Sru  printf("\n");
19374695Salfred
19474517Sru  GEN_OFFS(VMStructEntry, typeName);
19574695Salfred  GEN_OFFS(VMStructEntry, fieldName);
19674517Sru  GEN_OFFS(VMStructEntry, address);
19774517Sru  GEN_SIZE(VMStructEntry);
19874517Sru  printf("\n");
19974462Salfred
20074517Sru  GEN_VALUE(MAX_METHOD_CODE_SIZE, max_method_code_size);
20174517Sru#if defined(sparc) || defined(__sparc)
20274462Salfred  GEN_VALUE(OFFSET_interpreter_frame_method, 2 * pointer_size);     /* L2 in saved window */
20374517Sru  GEN_VALUE(OFFSET_interpreter_frame_sender_sp, 13 * pointer_size); /* I5 in saved window */
20474517Sru  // Fake value for consistency. It is not going to be used.
20574517Sru  GEN_VALUE(OFFSET_interpreter_frame_bcx_offset, 0xFFFF);
206108087Sru#elif defined(i386) || defined(__i386) || defined(__amd64)
20774517Sru  GEN_VALUE(OFFSET_interpreter_frame_sender_sp, -1 * pointer_size);
208108087Sru  GEN_VALUE(OFFSET_interpreter_frame_method, -3 * pointer_size);
20974462Salfred  GEN_VALUE(OFFSET_interpreter_frame_bcx_offset, -7 * pointer_size);
21074517Sru#endif
21174462Salfred
21274517Sru  GEN_OFFS(Klass, _name);
213108087Sru  GEN_OFFS(ConstantPool, _pool_holder);
21474517Sru  printf("\n");
21574462Salfred
21674462Salfred  GEN_VALUE(OFFSET_HeapBlockHeader_used, (int) offset_of(HeapBlock::Header, _used));
21774517Sru  GEN_OFFS(oopDesc, _metadata);
21874462Salfred  printf("\n");
21974462Salfred
22074517Sru  GEN_VALUE(AccessFlags_NATIVE, JVM_ACC_NATIVE);
22174462Salfred  GEN_VALUE(ConstMethod_has_linenumber_table, ConstMethod::_has_linenumber_table);
22274517Sru  GEN_OFFS(AccessFlags, _flags);
22374462Salfred  GEN_OFFS(Symbol, _length);
22474462Salfred  GEN_OFFS(Symbol, _body);
22574517Sru  printf("\n");
22674462Salfred
22774517Sru  GEN_OFFS(Method, _constMethod);
22874462Salfred  GEN_OFFS(Method, _constants);
22974462Salfred  GEN_OFFS(Method, _access_flags);
23074462Salfred  printf("\n");
23174517Sru
23274517Sru  GEN_OFFS(ConstMethod, _flags);
23374517Sru  GEN_OFFS(ConstMethod, _code_size);
23474517Sru  GEN_OFFS(ConstMethod, _name_index);
23574517Sru  GEN_OFFS(ConstMethod, _signature_index);
23674517Sru  printf("\n");
23774517Sru
23874517Sru  GEN_OFFS(CodeHeap, _memory);
23974517Sru  GEN_OFFS(CodeHeap, _segmap);
24074517Sru  GEN_OFFS(CodeHeap, _log2_segment_size);
24174517Sru  printf("\n");
24274517Sru
24374517Sru  GEN_OFFS(VirtualSpace, _low_boundary);
24474517Sru  GEN_OFFS(VirtualSpace, _high_boundary);
24574517Sru  GEN_OFFS(VirtualSpace, _low);
24674517Sru  GEN_OFFS(VirtualSpace, _high);
24774517Sru  printf("\n");
24874462Salfred
24974517Sru  GEN_OFFS(CodeBlob, _name);
25074462Salfred  GEN_OFFS(CodeBlob, _header_size);
25174517Sru  GEN_OFFS(CodeBlob, _content_offset);
25274517Sru  GEN_OFFS(CodeBlob, _code_offset);
25374462Salfred  GEN_OFFS(CodeBlob, _data_offset);
25474517Sru  GEN_OFFS(CodeBlob, _frame_size);
25574462Salfred  printf("\n");
25674517Sru
25774517Sru  GEN_OFFS(nmethod, _method);
25874517Sru  GEN_OFFS(nmethod, _oops_offset);
25974517Sru  GEN_OFFS(nmethod, _scopes_data_offset);
26074517Sru  GEN_OFFS(nmethod, _scopes_pcs_offset);
26174462Salfred  GEN_OFFS(nmethod, _handler_table_offset);
26274517Sru  GEN_OFFS(nmethod, _deoptimize_offset);
26374462Salfred  GEN_OFFS(nmethod, _orig_pc_offset);
26474517Sru
26574462Salfred  GEN_OFFS(PcDesc, _pc_offset);
26674517Sru  GEN_OFFS(PcDesc, _scope_decode_offset);
26774462Salfred
26874517Sru  printf("\n");
26974462Salfred
27074462Salfred  GEN_OFFS(NarrowOopStruct, _base);
27174517Sru  GEN_OFFS(NarrowOopStruct, _shift);
27274462Salfred  printf("\n");
27374517Sru
27474462Salfred  GEN_VALUE(SIZE_HeapBlockHeader, (int) sizeof(HeapBlock::Header));
27574462Salfred  GEN_SIZE(oopDesc);
27674517Sru  GEN_SIZE(ConstantPool);
27774462Salfred  printf("\n");
27874517Sru
27974517Sru  GEN_SIZE(PcDesc);
28074462Salfred  GEN_SIZE(Method);
28174517Sru  GEN_SIZE(ConstMethod);
28274517Sru  GEN_SIZE(nmethod);
28374517Sru  GEN_SIZE(CodeBlob);
28474517Sru  GEN_SIZE(BufferBlob);
28574517Sru  GEN_SIZE(SingletonBlob);
28674517Sru  GEN_SIZE(RuntimeStub);
28774517Sru  GEN_SIZE(SafepointBlob);
28874517Sru
28974517Sru  gen_epilogue(gen_variant);
29074517Sru  printf("\n");
29174517Sru
29274517Sru  fflush(stdout);
29374517Sru  return 0;
29474517Sru}
29574517Sru