diff options
Diffstat (limited to 'compiler/optimizing/graph_visualizer.cc')
| -rw-r--r-- | compiler/optimizing/graph_visualizer.cc | 50 | 
1 files changed, 37 insertions, 13 deletions
diff --git a/compiler/optimizing/graph_visualizer.cc b/compiler/optimizing/graph_visualizer.cc index 5ff31cead58..54d46445804 100644 --- a/compiler/optimizing/graph_visualizer.cc +++ b/compiler/optimizing/graph_visualizer.cc @@ -390,16 +390,23 @@ class HGraphVisualizerPrinter : public HGraphDelegateVisitor {      StartAttributeStream("load_kind") << load_string->GetLoadKind();    } -  void VisitCheckCast(HCheckCast* check_cast) OVERRIDE { -    StartAttributeStream("check_kind") << check_cast->GetTypeCheckKind(); +  void HandleTypeCheckInstruction(HTypeCheckInstruction* check) { +    StartAttributeStream("check_kind") << check->GetTypeCheckKind();      StartAttributeStream("must_do_null_check") << std::boolalpha -        << check_cast->MustDoNullCheck() << std::noboolalpha; +        << check->MustDoNullCheck() << std::noboolalpha; +    if (check->GetTypeCheckKind() == TypeCheckKind::kBitstringCheck) { +      StartAttributeStream("path_to_root") << std::hex +          << "0x" << check->GetBitstringPathToRoot() << std::dec; +      StartAttributeStream("mask") << std::hex << "0x" << check->GetBitstringMask() << std::dec; +    } +  } + +  void VisitCheckCast(HCheckCast* check_cast) OVERRIDE { +    HandleTypeCheckInstruction(check_cast);    }    void VisitInstanceOf(HInstanceOf* instance_of) OVERRIDE { -    StartAttributeStream("check_kind") << instance_of->GetTypeCheckKind(); -    StartAttributeStream("must_do_null_check") << std::boolalpha -        << instance_of->MustDoNullCheck() << std::noboolalpha; +    HandleTypeCheckInstruction(instance_of);    }    void VisitArrayLength(HArrayLength* array_length) OVERRIDE { @@ -576,6 +583,11 @@ class HGraphVisualizerPrinter : public HGraphDelegateVisitor {        }        StartAttributeStream() << input_list;      } +    if (instruction->GetDexPc() != kNoDexPc) { +      StartAttributeStream("dex_pc") << instruction->GetDexPc(); +    } else { +      StartAttributeStream("dex_pc") << "n/a"; +    }      instruction->Accept(this);      if (instruction->HasEnvironment()) {        StringList envs; @@ -641,20 +653,32 @@ class HGraphVisualizerPrinter : public HGraphDelegateVisitor {            << std::boolalpha << loop_info->IsIrreducible() << std::noboolalpha;      } +    // For the builder and the inliner, we want to add extra information on HInstructions +    // that have reference types, and also HInstanceOf/HCheckcast.      if ((IsPass(HGraphBuilder::kBuilderPassName)          || IsPass(HInliner::kInlinerPassName)) -        && (instruction->GetType() == DataType::Type::kReference)) { -      ReferenceTypeInfo info = instruction->IsLoadClass() -        ? instruction->AsLoadClass()->GetLoadedClassRTI() -        : instruction->GetReferenceTypeInfo(); +        && (instruction->GetType() == DataType::Type::kReference || +            instruction->IsInstanceOf() || +            instruction->IsCheckCast())) { +      ReferenceTypeInfo info = (instruction->GetType() == DataType::Type::kReference) +          ? instruction->IsLoadClass() +              ? instruction->AsLoadClass()->GetLoadedClassRTI() +              : instruction->GetReferenceTypeInfo() +          : instruction->IsInstanceOf() +              ? instruction->AsInstanceOf()->GetTargetClassRTI() +              : instruction->AsCheckCast()->GetTargetClassRTI();        ScopedObjectAccess soa(Thread::Current());        if (info.IsValid()) {          StartAttributeStream("klass")              << mirror::Class::PrettyDescriptor(info.GetTypeHandle().Get()); -        StartAttributeStream("can_be_null") -            << std::boolalpha << instruction->CanBeNull() << std::noboolalpha; +        if (instruction->GetType() == DataType::Type::kReference) { +          StartAttributeStream("can_be_null") +              << std::boolalpha << instruction->CanBeNull() << std::noboolalpha; +        }          StartAttributeStream("exact") << std::boolalpha << info.IsExact() << std::noboolalpha; -      } else if (instruction->IsLoadClass()) { +      } else if (instruction->IsLoadClass() || +                 instruction->IsInstanceOf() || +                 instruction->IsCheckCast()) {          StartAttributeStream("klass") << "unresolved";        } else {          // The NullConstant may be added to the graph during other passes that happen between  | 
