Index: runtime/vm/intrinsifier.cc |
=================================================================== |
--- runtime/vm/intrinsifier.cc (revision 15200) |
+++ runtime/vm/intrinsifier.cc (working copy) |
@@ -64,6 +64,8 @@ |
bool Intrinsifier::CanIntrinsify(const Function& function) { |
if (!FLAG_intrinsify) return false; |
if (function.IsClosureFunction()) return false; |
+ // Can occur because of compile-all flag. |
+ if (function.is_external()) return false; |
// Intrinsic kind is set lazily below. |
if (function.intrinsic_kind() == Function::kIsIntrinsic) return true; |
if (function.intrinsic_kind() == Function::kIsNotIntrinsic) return false; |
@@ -77,7 +79,7 @@ |
return false; |
} |
const char* class_name = String::Handle(function_class.Name()).ToCString(); |
-#define FIND_INTRINSICS(test_class_name, test_function_name, destination) \ |
+#define FIND_INTRINSICS(test_class_name, test_function_name, destination, fp) \ |
if (TestFunction(function, \ |
class_name, function_name, \ |
#test_class_name, #test_function_name)) { \ |
@@ -91,15 +93,30 @@ |
return false; |
} |
+ |
+static bool CheckFingerprint(const Function& function, intptr_t fp) { |
+ if (function.SourceFingerprint() != fp) { |
+ OS::Print("FP mismatch while intrinsifying %s:" |
+ " expecting %"Pd" found %d\n", |
+ function.ToFullyQualifiedCString(), |
+ fp, |
+ function.SourceFingerprint()); |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+ |
bool Intrinsifier::Intrinsify(const Function& function, Assembler* assembler) { |
if (!CanIntrinsify(function)) return false; |
const char* function_name = String::Handle(function.name()).ToCString(); |
const Class& function_class = Class::Handle(function.Owner()); |
const char* class_name = String::Handle(function_class.Name()).ToCString(); |
-#define FIND_INTRINSICS(test_class_name, test_function_name, destination) \ |
+#define FIND_INTRINSICS(test_class_name, test_function_name, destination, fp) \ |
if (TestFunction(function, \ |
class_name, function_name, \ |
#test_class_name, #test_function_name)) { \ |
+ ASSERT(CheckFingerprint(function, fp)); \ |
return destination(assembler); \ |
} \ |