# HG changeset patch # User kzhaldyb # Date 1481548587 -10800 # Mon Dec 12 16:16:27 2016 +0300 # Node ID c631bb2b997bfaa1126545dfd533857b6b7d2bbb # Parent b8f046feac3ef4924f86e1c9456a22e76d20bc0d 8171090: Convert VMStruct_test to GTest Reviewed-by: duke diff --git a/src/share/vm/runtime/vmStructs.cpp b/src/share/vm/runtime/vmStructs.cpp --- a/src/share/vm/runtime/vmStructs.cpp +++ b/src/share/vm/runtime/vmStructs.cpp @@ -3021,6 +3021,10 @@ GENERATE_VM_STRUCT_LAST_ENTRY() }; +size_t VMStructs::localHotSpotVMStructsLength() { + return sizeof(localHotSpotVMStructs) / sizeof(VMStructEntry); +} + VMTypeEntry VMStructs::localHotSpotVMTypes[] = { VM_TYPES(GENERATE_VM_TYPE_ENTRY, @@ -3083,6 +3087,10 @@ GENERATE_VM_TYPE_LAST_ENTRY() }; +size_t VMStructs::localHotSpotVMTypesLength() { + return sizeof(localHotSpotVMTypes) / sizeof(VMTypeEntry); +} + VMIntConstantEntry VMStructs::localHotSpotVMIntConstants[] = { VM_INT_CONSTANTS(GENERATE_VM_INT_CONSTANT_ENTRY, @@ -3125,6 +3133,10 @@ GENERATE_VM_INT_CONSTANT_LAST_ENTRY() }; +size_t VMStructs::localHotSpotVMIntConstantsLength() { + return sizeof(localHotSpotVMIntConstants) / sizeof(VMIntConstantEntry); +} + VMLongConstantEntry VMStructs::localHotSpotVMLongConstants[] = { VM_LONG_CONSTANTS(GENERATE_VM_LONG_CONSTANT_ENTRY, @@ -3154,6 +3166,10 @@ GENERATE_VM_LONG_CONSTANT_LAST_ENTRY() }; +size_t VMStructs::localHotSpotVMLongConstantsLength() { + return sizeof(localHotSpotVMLongConstants) / sizeof(VMLongConstantEntry); +} + // This is used both to check the types of referenced fields and, in // debug builds, to ensure that all of the field types are present. void @@ -3445,45 +3461,3 @@ void vmStructs_init() { debug_only(VMStructs::init()); } - -#ifndef PRODUCT -void VMStructs::test() { - // Make sure last entry in the each array is indeed the correct end marker. - // The reason why these are static is to make sure they are zero initialized. - // Putting them on the stack will leave some garbage in the padding of some fields. - static VMStructEntry struct_last_entry = GENERATE_VM_STRUCT_LAST_ENTRY(); - assert(memcmp(&localHotSpotVMStructs[(sizeof(localHotSpotVMStructs) / sizeof(VMStructEntry)) - 1], - &struct_last_entry, - sizeof(VMStructEntry)) == 0, "Incorrect last entry in localHotSpotVMStructs"); - - static VMTypeEntry type_last_entry = GENERATE_VM_TYPE_LAST_ENTRY(); - assert(memcmp(&localHotSpotVMTypes[sizeof(localHotSpotVMTypes) / sizeof(VMTypeEntry) - 1], - &type_last_entry, - sizeof(VMTypeEntry)) == 0, "Incorrect last entry in localHotSpotVMTypes"); - - static VMIntConstantEntry int_last_entry = GENERATE_VM_INT_CONSTANT_LAST_ENTRY(); - assert(memcmp(&localHotSpotVMIntConstants[sizeof(localHotSpotVMIntConstants) / sizeof(VMIntConstantEntry) - 1], - &int_last_entry, - sizeof(VMIntConstantEntry)) == 0, "Incorrect last entry in localHotSpotVMIntConstants"); - - static VMLongConstantEntry long_last_entry = GENERATE_VM_LONG_CONSTANT_LAST_ENTRY(); - assert(memcmp(&localHotSpotVMLongConstants[sizeof(localHotSpotVMLongConstants) / sizeof(VMLongConstantEntry) - 1], - &long_last_entry, - sizeof(VMLongConstantEntry)) == 0, "Incorrect last entry in localHotSpotVMLongConstants"); - - - // Check for duplicate entries in type array - for (int i = 0; localHotSpotVMTypes[i].typeName != NULL; i++) { - for (int j = i + 1; localHotSpotVMTypes[j].typeName != NULL; j++) { - if (strcmp(localHotSpotVMTypes[i].typeName, localHotSpotVMTypes[j].typeName) == 0) { - tty->print_cr("Duplicate entries for '%s'", localHotSpotVMTypes[i].typeName); - assert(false, "Duplicate types in localHotSpotVMTypes array"); - } - } - } -} - -void VMStructs_test() { - VMStructs::test(); -} -#endif diff --git a/src/share/vm/runtime/vmStructs.hpp b/src/share/vm/runtime/vmStructs.hpp --- a/src/share/vm/runtime/vmStructs.hpp +++ b/src/share/vm/runtime/vmStructs.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -107,20 +107,28 @@ // The last entry is identified over in the serviceability agent by // the fact that it has a NULL fieldName static VMStructEntry localHotSpotVMStructs[]; + // The function to get localHotSpotVMStructs length + static size_t localHotSpotVMStructsLength(); // The last entry is identified over in the serviceability agent by // the fact that it has a NULL typeName static VMTypeEntry localHotSpotVMTypes[]; + // The function to get localHotSpotVMTypes length + static size_t localHotSpotVMTypesLength(); // Table of integer constants required by the serviceability agent. // The last entry is identified over in the serviceability agent by // the fact that it has a NULL typeName static VMIntConstantEntry localHotSpotVMIntConstants[]; + // The function to get localHotSpotVMIntConstants length + static size_t localHotSpotVMIntConstantsLength(); // Table of long constants required by the serviceability agent. // The last entry is identified over in the serviceability agent by // the fact that it has a NULL typeName static VMLongConstantEntry localHotSpotVMLongConstants[]; + // The function to get localHotSpotVMIntConstants length + static size_t localHotSpotVMLongConstantsLength(); /** * Table of addresses. diff --git a/src/share/vm/utilities/internalVMTests.cpp b/src/share/vm/utilities/internalVMTests.cpp --- a/src/share/vm/utilities/internalVMTests.cpp +++ b/src/share/vm/utilities/internalVMTests.cpp @@ -49,9 +49,6 @@ run_unit_test(GCTimer_test); run_unit_test(ObjectMonitor_test); run_unit_test(DirectivesParser_test); -#if INCLUDE_VM_STRUCTS - run_unit_test(VMStructs_test); -#endif tty->print_cr("All internal VM tests passed"); } diff --git a/test/native/runtime/test_vmStructs.cpp b/test/native/runtime/test_vmStructs.cpp new file mode 100644 --- /dev/null +++ b/test/native/runtime/test_vmStructs.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include "precompiled.hpp" +#include "runtime/vmStructs.hpp" +#include "utilities/macros.hpp" +#include "unittest.hpp" + +#if INCLUDE_VM_STRUCTS +TEST(VMStructs, last_entries) { + // Make sure last entry in the each array is indeed the correct end marker. + // The reason why these are static is to make sure they are zero initialized. + // Putting them on the stack will leave some garbage in the padding of some fields. + static VMStructEntry struct_last_entry = GENERATE_VM_STRUCT_LAST_ENTRY(); + EXPECT_EQ(0, memcmp(&VMStructs::localHotSpotVMStructs[VMStructs::localHotSpotVMStructsLength() - 1], + &struct_last_entry, + sizeof(VMStructEntry))) << "Incorrect last entry in localHotSpotVMStructs"; + + static VMTypeEntry type_last_entry = GENERATE_VM_TYPE_LAST_ENTRY(); + EXPECT_EQ(0, memcmp(&VMStructs::localHotSpotVMTypes[VMStructs::localHotSpotVMTypesLength() - 1], + &type_last_entry, + sizeof(VMTypeEntry))) << "Incorrect last entry in localHotSpotVMTypes"; + + static VMIntConstantEntry int_last_entry = GENERATE_VM_INT_CONSTANT_LAST_ENTRY(); + EXPECT_EQ(0, memcmp(&VMStructs::localHotSpotVMIntConstants[VMStructs::localHotSpotVMIntConstantsLength() - 1], + &int_last_entry, + sizeof(VMIntConstantEntry))) << "Incorrect last entry in localHotSpotVMIntConstants"; + + static VMLongConstantEntry long_last_entry = GENERATE_VM_LONG_CONSTANT_LAST_ENTRY(); + EXPECT_EQ(0, memcmp(&VMStructs::localHotSpotVMLongConstants[VMStructs::localHotSpotVMLongConstantsLength() - 1], + &long_last_entry, + sizeof(VMLongConstantEntry))) << "Incorrect last entry in localHotSpotVMLongConstants"; +} + +TEST(VMStructs, VMTypes_duplicates) { + // Check for duplicate entries in type array + for (int i = 0; VMStructs::localHotSpotVMTypes[i].typeName != NULL; i++) { + for (int j = i + 1; VMStructs::localHotSpotVMTypes[j].typeName != NULL; j++) { + EXPECT_STRNE(VMStructs::localHotSpotVMTypes[i].typeName, VMStructs::localHotSpotVMTypes[j].typeName) + << "Duplicate entries on indexes " << i << " and " << j; + } + } +} +#endif