Path: blob/master/test/hotspot/gtest/gc/z/test_zAddress.cpp
41149 views
/*1* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223#include "precompiled.hpp"24#include "gc/z/zAddress.inline.hpp"25#include "gc/z/zGlobals.hpp"26#include "unittest.hpp"2728class ZAddressTest : public ::testing::Test {29protected:30static void is_good_bit(uintptr_t bit_mask) {31// Setup32ZAddress::initialize();33ZAddress::set_good_mask(bit_mask);3435// Test that a pointer with only the given bit is considered good.36EXPECT_EQ(ZAddress::is_good(ZAddressMetadataMarked0), (bit_mask == ZAddressMetadataMarked0));37EXPECT_EQ(ZAddress::is_good(ZAddressMetadataMarked1), (bit_mask == ZAddressMetadataMarked1));38EXPECT_EQ(ZAddress::is_good(ZAddressMetadataRemapped), (bit_mask == ZAddressMetadataRemapped));3940// Test that a pointer with the given bit and some extra bits is considered good.41EXPECT_EQ(ZAddress::is_good(ZAddressMetadataMarked0 | 0x8),(bit_mask == ZAddressMetadataMarked0));42EXPECT_EQ(ZAddress::is_good(ZAddressMetadataMarked1 | 0x8), (bit_mask == ZAddressMetadataMarked1));43EXPECT_EQ(ZAddress::is_good(ZAddressMetadataRemapped | 0x8), (bit_mask == ZAddressMetadataRemapped));4445// Test that null is not considered good.46EXPECT_FALSE(ZAddress::is_good(0));47}4849static void is_good_or_null_bit(uintptr_t bit_mask) {50// Setup51ZAddress::initialize();52ZAddress::set_good_mask(bit_mask);5354// Test that a pointer with only the given bit is considered good.55EXPECT_EQ(ZAddress::is_good_or_null(ZAddressMetadataMarked0), (bit_mask == ZAddressMetadataMarked0));56EXPECT_EQ(ZAddress::is_good_or_null(ZAddressMetadataMarked1), (bit_mask == ZAddressMetadataMarked1));57EXPECT_EQ(ZAddress::is_good_or_null(ZAddressMetadataRemapped), (bit_mask == ZAddressMetadataRemapped));5859// Test that a pointer with the given bit and some extra bits is considered good.60EXPECT_EQ(ZAddress::is_good_or_null(ZAddressMetadataMarked0 | 0x8), (bit_mask == ZAddressMetadataMarked0));61EXPECT_EQ(ZAddress::is_good_or_null(ZAddressMetadataMarked1 | 0x8), (bit_mask == ZAddressMetadataMarked1));62EXPECT_EQ(ZAddress::is_good_or_null(ZAddressMetadataRemapped | 0x8), (bit_mask == ZAddressMetadataRemapped));6364// Test that null is considered good_or_null.65EXPECT_TRUE(ZAddress::is_good_or_null(0));66}6768static void finalizable() {69// Setup70ZAddress::initialize();71ZAddress::flip_to_marked();7273// Test that a normal good pointer is good and weak good, but not finalizable74const uintptr_t addr1 = ZAddress::good(1);75EXPECT_FALSE(ZAddress::is_finalizable(addr1));76EXPECT_TRUE(ZAddress::is_marked(addr1));77EXPECT_FALSE(ZAddress::is_remapped(addr1));78EXPECT_TRUE(ZAddress::is_weak_good(addr1));79EXPECT_TRUE(ZAddress::is_weak_good_or_null(addr1));80EXPECT_TRUE(ZAddress::is_good(addr1));81EXPECT_TRUE(ZAddress::is_good_or_null(addr1));8283// Test that a finalizable good pointer is finalizable and weak good, but not good84const uintptr_t addr2 = ZAddress::finalizable_good(1);85EXPECT_TRUE(ZAddress::is_finalizable(addr2));86EXPECT_TRUE(ZAddress::is_marked(addr2));87EXPECT_FALSE(ZAddress::is_remapped(addr2));88EXPECT_TRUE(ZAddress::is_weak_good(addr2));89EXPECT_TRUE(ZAddress::is_weak_good_or_null(addr2));90EXPECT_FALSE(ZAddress::is_good(addr2));91EXPECT_FALSE(ZAddress::is_good_or_null(addr2));9293// Flip to remapped and test that it's no longer weak good94ZAddress::flip_to_remapped();95EXPECT_TRUE(ZAddress::is_finalizable(addr2));96EXPECT_TRUE(ZAddress::is_marked(addr2));97EXPECT_FALSE(ZAddress::is_remapped(addr2));98EXPECT_FALSE(ZAddress::is_weak_good(addr2));99EXPECT_FALSE(ZAddress::is_weak_good_or_null(addr2));100EXPECT_FALSE(ZAddress::is_good(addr2));101EXPECT_FALSE(ZAddress::is_good_or_null(addr2));102}103};104105TEST_F(ZAddressTest, is_good) {106is_good_bit(ZAddressMetadataMarked0);107is_good_bit(ZAddressMetadataMarked1);108is_good_bit(ZAddressMetadataRemapped);109}110111TEST_F(ZAddressTest, is_good_or_null) {112is_good_or_null_bit(ZAddressMetadataMarked0);113is_good_or_null_bit(ZAddressMetadataMarked1);114is_good_or_null_bit(ZAddressMetadataRemapped);115}116117TEST_F(ZAddressTest, is_weak_good_or_null) {118#define check_is_weak_good_or_null(value) \119EXPECT_EQ(ZAddress::is_weak_good_or_null(value), \120(ZAddress::is_good_or_null(value) || ZAddress::is_remapped(value))) \121<< "is_good_or_null: " << ZAddress::is_good_or_null(value) \122<< " is_remaped: " << ZAddress::is_remapped(value) \123<< " is_good_or_null_or_remapped: " << ZAddress::is_weak_good_or_null(value)124125check_is_weak_good_or_null((uintptr_t)NULL);126check_is_weak_good_or_null(ZAddressMetadataMarked0);127check_is_weak_good_or_null(ZAddressMetadataMarked1);128check_is_weak_good_or_null(ZAddressMetadataRemapped);129check_is_weak_good_or_null((uintptr_t)0x123);130}131132TEST_F(ZAddressTest, finalizable) {133finalizable();134}135136137