001 /*
002 * This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 * This file is licensed to You under the Eclipse Public License (EPL);
005 * You may not use this file except in compliance with the License. You
006 * may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 * See the COPYRIGHT.txt file distributed with this work for information
011 * regarding copyright ownership.
012 */
013 package org.jikesrvm.compilers.opt.escape;
014
015 import org.jikesrvm.classloader.RVMMethod;
016
017 /**
018 * Hold semantic information about a method that is not defined in
019 * RVMMethod.
020 */
021 class MethodSummary {
022
023 /**
024 * Is this method currently being analyzed? Used for recursive
025 * invocations of the optimizing compiler.
026 */
027 private static boolean inProgress = false;
028
029 /**
030 * Default escape result, that the result escapes but that no parameter is
031 * escaping.
032 */
033 private static final long RES_ESCAPE = 0x80000000;
034
035 /**
036 * Escape result, top bit is result of the method bits 0..63 are for
037 * parameters 0..63 respectively
038 */
039 private long escapeInfo = RES_ESCAPE;
040
041 /**
042 * @param m RVMMethod representing this method.
043 */
044 MethodSummary(RVMMethod m) { }
045
046 /**
047 * Record that a parameter may or may not escape from a thread.
048 *
049 * @param p the number of the parameter
050 * @param b may it escape?
051 */
052 public void setParameterMayEscapeThread(int p, boolean b) {
053 if (p > 62) return; // all params past 62 escape!
054 long mask = 1L << p;
055 if (b) {
056 escapeInfo |= mask;
057 } else {
058 escapeInfo &= (~mask);
059 }
060 }
061
062 /**
063 * Query whether a parameter may escape from a thread.
064 * @param p the number of the parameter
065 * @return false iff the parameter <em> must not </em> escape from the
066 * thread. true otherwise.
067 */
068 public boolean parameterMayEscapeThread(int p) {
069 if (p > 62) return true; // all params past 62 escape!
070 long mask = 1L << p;
071 return (escapeInfo & mask) != 0;
072 }
073
074 /**
075 * Record that a result of this method may or may not escape from a thread.
076 *
077 * @param b may it escape?
078 */
079 public void setResultMayEscapeThread(boolean b) {
080 if (b) {
081 escapeInfo |= RES_ESCAPE;
082 } else {
083 escapeInfo &= ~RES_ESCAPE;
084 }
085 }
086
087 /**
088 * Query whether the result of this method may escape from a thread.
089 * @return false iff the parameter <em> must not </em> escape from the
090 * thread. true otherwise.
091 */
092 public boolean resultMayEscapeThread() {
093 return (escapeInfo & RES_ESCAPE) != 0L;
094 }
095
096 /**
097 * Is analysis of this method in progress?
098 */
099 public boolean inProgress() {
100 return inProgress;
101 }
102
103 /**
104 * Mark that analysis of this method is or is not in progress.
105 * @param b
106 */
107 public void setInProgress(boolean b) {
108 inProgress = b;
109 }
110 }