test/compiler/intrinsics/unsafe/UnsafeGetAddressTest.java

Mon, 24 Mar 2014 08:43:10 -0700

author
poonam
date
Mon, 24 Mar 2014 08:43:10 -0700
changeset 6425
9ab9f254cfe2
parent 0
f90c822e73f8
permissions
-rw-r--r--

6653795: C2 intrinsic for Unsafe.getAddress performs pointer sign extension on 32-bit systems
Summary: Native pointers less than 64 bits wide should be extended as an unsigned number.
Reviewed-by: kvn, kevinw

     1 /*
     2  * Copyright (c) 2014, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  */
    24 /*
    25  * @test
    26  * @bug 6653795
    27  * @summary C2 intrinsic for Unsafe.getAddress performs pointer sign extension on 32-bit systems
    28  * @run main UnsafeGetAddressTest
    29  *
    30  */
    32 import sun.misc.Unsafe;
    33 import java.lang.reflect.*;
    35 public class UnsafeGetAddressTest {
    36     private static Unsafe unsafe;
    38     public static void main(String[] args) throws Exception {
    39         Class c = UnsafeGetAddressTest.class.getClassLoader().loadClass("sun.misc.Unsafe");
    40         Field f = c.getDeclaredField("theUnsafe");
    41         f.setAccessible(true);
    42         unsafe = (Unsafe)f.get(c);
    44         long address = unsafe.allocateMemory(unsafe.addressSize());
    45         unsafe.putAddress(address, 0x0000000080000000L);
    46         // from sun.misc.Unsafe.getAddress' documentation:
    47         // "If the native pointer is less than 64 bits wide, it is
    48         // extended as an unsigned number to a Java long."
    49         result = unsafe.getAddress(address);
    50         System.out.printf("1: was 0x%x, expected 0x%x\n", result,
    51                 0x0000000080000000L);
    52         for (int i = 0; i < 1000000; i++) {
    53             result = unsafe.getAddress(address);
    54         }
    56         // The code has got compiled, check the result now
    57         System.out.printf("2: was 0x%x, expected 0x%x\n", result,
    58                 0x0000000080000000L);
    59         if (result != 0x0000000080000000L) {
    60             System.out.println("Test Failed");
    61             System.exit(97);
    62         } else {
    63             System.out.println("Test Passed");
    64         }
    65     }
    66     static volatile long result;
    67 }

mercurial