diff options
| author | 2015-04-24 18:17:40 +0000 | |
|---|---|---|
| committer | 2015-04-24 18:17:41 +0000 | |
| commit | eb5459ca861b58ee8a9907789f11400dcdddb87b (patch) | |
| tree | 36c1f328c48f0ec111ee31702cc4a82ddb2ad784 /compiler/optimizing/graph_checker.cc | |
| parent | ae803f6efbe8378b5423c51ee3c5564cae0e6e59 (diff) | |
| parent | 4c0eb42259d790fddcd9978b66328dbb3ab65615 (diff) | |
Merge "Ensure inlined static calls perform clinit checks in Optimizing."
Diffstat (limited to 'compiler/optimizing/graph_checker.cc')
| -rw-r--r-- | compiler/optimizing/graph_checker.cc | 28 | 
1 files changed, 26 insertions, 2 deletions
diff --git a/compiler/optimizing/graph_checker.cc b/compiler/optimizing/graph_checker.cc index e1649fd3cd..890676467f 100644 --- a/compiler/optimizing/graph_checker.cc +++ b/compiler/optimizing/graph_checker.cc @@ -191,6 +191,30 @@ void GraphChecker::VisitInstruction(HInstruction* instruction) {    }  } +void GraphChecker::VisitInvokeStaticOrDirect(HInvokeStaticOrDirect* invoke) { +  VisitInstruction(invoke); + +  if (invoke->IsStaticWithExplicitClinitCheck()) { +    size_t last_input_index = invoke->InputCount() - 1; +    HInstruction* last_input = invoke->InputAt(last_input_index); +    if (last_input == nullptr) { +      AddError(StringPrintf("Static invoke %s:%d marked as having an explicit clinit check " +                            "has a null pointer as last input.", +                            invoke->DebugName(), +                            invoke->GetId())); +    } +    if (!last_input->IsClinitCheck() && !last_input->IsLoadClass()) { +      AddError(StringPrintf("Static invoke %s:%d marked as having an explicit clinit check " +                            "has a last instruction (%s:%d) which is neither a clinit check " +                            "nor a load class instruction.", +                            invoke->DebugName(), +                            invoke->GetId(), +                            last_input->DebugName(), +                            last_input->GetId())); +    } +  } +} +  void SSAChecker::VisitBasicBlock(HBasicBlock* block) {    super_type::VisitBasicBlock(block); @@ -496,7 +520,7 @@ void SSAChecker::VisitBinaryOperation(HBinaryOperation* op) {            Primitive::PrettyDescriptor(op->InputAt(1)->GetType())));      }    } else { -    if (PrimitiveKind(op->InputAt(1)->GetType()) != PrimitiveKind(op->InputAt(0)->GetType())) { +    if (PrimitiveKind(op->InputAt(0)->GetType()) != PrimitiveKind(op->InputAt(1)->GetType())) {        AddError(StringPrintf(            "Binary operation %s %d has inputs of different types: "            "%s, and %s.", @@ -521,7 +545,7 @@ void SSAChecker::VisitBinaryOperation(HBinaryOperation* op) {            "from its input type: %s vs %s.",            op->DebugName(), op->GetId(),            Primitive::PrettyDescriptor(op->GetType()), -          Primitive::PrettyDescriptor(op->InputAt(1)->GetType()))); +          Primitive::PrettyDescriptor(op->InputAt(0)->GetType())));      }    }  }  |