001/*
002 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation.
008 *
009 * This code is distributed in the hope that it will be useful, but WITHOUT
010 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
011 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
012 * version 2 for more details (a copy is included in the LICENSE file that
013 * accompanied this code).
014 *
015 * You should have received a copy of the GNU General Public License version
016 * 2 along with this work; if not, write to the Free Software Foundation,
017 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
018 *
019 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
020 * or visit www.oracle.com if you need additional information or have any
021 * questions.
022 */
023package com.oracle.graal.hotspot.word;
024
025import jdk.internal.jvmci.meta.*;
026
027import com.oracle.graal.compiler.common.type.*;
028import com.oracle.graal.word.*;
029
030/**
031 * Extends {@link WordTypes} with information about HotSpot metaspace pointer types.
032 */
033public class HotSpotWordTypes extends WordTypes {
034
035    /**
036     * Resolved type for {@link MetaspacePointer}.
037     */
038    private final ResolvedJavaType metaspacePointerType;
039
040    /**
041     * Resolved type for {@link KlassPointer}.
042     */
043    private final ResolvedJavaType klassPointerType;
044
045    /**
046     * Resolved type for {@link MethodPointer}.
047     */
048    private final ResolvedJavaType methodPointerType;
049
050    private final Stamp klassPointerStamp;
051
052    private final Stamp methodPointerStamp;
053
054    public HotSpotWordTypes(MetaAccessProvider metaAccess, Kind wordKind, Stamp klassPointerStamp, Stamp methodPointerStamp) {
055        super(metaAccess, wordKind);
056        this.metaspacePointerType = metaAccess.lookupJavaType(MetaspacePointer.class);
057        this.klassPointerType = metaAccess.lookupJavaType(KlassPointer.class);
058        this.methodPointerType = metaAccess.lookupJavaType(MethodPointer.class);
059        this.klassPointerStamp = klassPointerStamp;
060        this.methodPointerStamp = methodPointerStamp;
061    }
062
063    @Override
064    public boolean isWord(ResolvedJavaType type) {
065        if (type != null && metaspacePointerType.isAssignableFrom(type)) {
066            return true;
067        }
068        return super.isWord(type);
069    }
070
071    @Override
072    public Kind asKind(JavaType type) {
073        if (klassPointerType.equals(type) || methodPointerType.equals(type)) {
074            return getWordKind();
075        }
076        return super.asKind(type);
077    }
078
079    @Override
080    public Stamp getWordStamp(ResolvedJavaType type) {
081        if (type.equals(klassPointerType)) {
082            return klassPointerStamp;
083        } else if (type.equals(methodPointerType)) {
084            return methodPointerStamp;
085        }
086        return super.getWordStamp(type);
087    }
088
089    public Stamp getKlassPointerStamp() {
090        return klassPointerStamp;
091    }
092
093    public Stamp getMethodPointerStamp() {
094        return methodPointerStamp;
095    }
096}