summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2010-01-07 17:01:01 +0000
committerIulian Dragos <jaguarul@gmail.com>2010-01-07 17:01:01 +0000
commit4c879e308827260f5d0aa037819a88a565db4cb4 (patch)
tree335a7265514dd818884c82950166bc5101b72f5e /src/compiler
parent677352f871b46d0e71ae00095808dbf83e7132d0 (diff)
downloadscala-4c879e308827260f5d0aa037819a88a565db4cb4.tar.gz
scala-4c879e308827260f5d0aa037819a88a565db4cb4.tar.bz2
scala-4c879e308827260f5d0aa037819a88a565db4cb4.zip
Added warning for failed inlining when the targ...
Added warning for failed inlining when the target is @inline annotated. No review necessary.
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/Inliners.scala27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
index 8e77c493dd..4c9a996cec 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
@@ -278,10 +278,13 @@ abstract class Inliners extends SubComponent {
assert(pending.isEmpty, "Pending NEW elements: " + pending)
}
+ /** The current iclass */
+ private var currentIClazz: IClass = _
+
def analyzeClass(cls: IClass): Unit = if (settings.inline.value) {
if (settings.debug.value)
log("Analyzing " + cls);
-
+ this.currentIClazz = cls
cls.methods filterNot (_.symbol.isConstructor) foreach analyzeMethod
}
@@ -311,6 +314,12 @@ abstract class Inliners extends SubComponent {
if (!retry) {
i match {
case CALL_METHOD(msym, Dynamic) =>
+ def warnNoInline(reason: String) = {
+ if (msym.hasAnnotation(ScalaInlineAttr))
+ currentIClazz.cunit.warning(i.pos,
+ "Could not inline required method %s because %s.".format(msym.originalName.decode, reason))
+ }
+
val receiver = info.stack.types.drop(msym.info.paramTypes.length).head match {
case REFERENCE(s) => s;
case _ => NoSymbol;
@@ -361,12 +370,18 @@ abstract class Inliners extends SubComponent {
+ "\n\tinc.code ne null: " + (inc.code ne null) + (if (inc.code ne null)
"\n\tisSafeToInline(m, inc, info.stack): " + isSafeToInline(m, inc, info.stack)
+ "\n\tshouldInline heuristics: " + shouldInline(m, inc) else ""));
+ warnNoInline(
+ if (inc.code eq null) "bytecode was unavailable"
+ else if (!isSafeToInline(m, inc, info.stack)) "it is unsafe (target may reference private fields)"
+ else "a bug (run with -Ylog:inline -Ydebug for more information)")
}
case None =>
+ warnNoInline("bytecode was not available")
if (settings.debug.value)
log("could not find icode\n\treceiver: " + receiver + "\n\tmethod: " + concreteMethod)
}
- }
+ } else
+ warnNoInline(if (icodes.available(receiver)) "it is not final" else "bytecode was not available")
case _ => ();
}
@@ -375,14 +390,6 @@ abstract class Inliners extends SubComponent {
if (tfa.stat) log(m.symbol.fullNameString + " iterations: " + tfa.iterations + " (size: " + m.code.blocks.length + ")")
}} while (retry && count < 15)
m.normalize
-// } catch {
-// case e =>
-// Console.println("############# Caught exception: " + e + " #################");
-// Console.println("\nMethod: " + m +
-// "\nMethod owner: " + m.symbol.owner);
-// e.printStackTrace();
-// m.dump
-// throw e
}