Esempio n. 1
0
void xml_symbol_convertt::convert(const symbolt& sym, xmlt &root)
{
  xmlt &xmlsym = root.new_element("symbol");
  irepcache.push_back(irept());
  sym.to_irep(irepcache.back());  
  irepconverter.reference_convert(irepcache.back(), xmlsym);
}
Esempio n. 2
0
void convert(const symbolt& sym, xmlt &root)
{
  xmlt &xmlsym = root.new_element("symbol");
  xmlsym.set_attribute("name", id2string(sym.name));

  xmlt &xmltype = xmlsym.new_element("type");
  convert(sym.type, xmltype);

  xmlt &xmlval = xmlsym.new_element("value");
  if(!sym.is_type && sym.type.id() == "code" && !sym.value.is_nil())
    xmlval.data = "compiled"; // only for implemented functions
  else
    convert(sym.value, xmlval);

  xmlt &flags = xmlsym.new_element("flags");

  flags.set_attribute_bool("lvalue", sym.is_lvalue);
  flags.set_attribute_bool("static_lifetime", sym.is_static_lifetime);
  flags.set_attribute_bool("file_local", sym.is_file_local);
  flags.set_attribute_bool("theorem", sym.is_property);
  flags.set_attribute_bool("thread_local", sym.is_thread_local);
  flags.set_attribute_bool("type", sym.is_type);
  flags.set_attribute_bool("extern", sym.is_extern);
  flags.set_attribute_bool("input", sym.is_input);
  flags.set_attribute_bool("output", sym.is_output);
  flags.set_attribute_bool("macro", sym.is_macro);
  //flags.set_attribute_bool("actual", sym.is_actual);
  //flags.set_attribute_bool("binding", sym.binding);
  //flags.set_attribute_bool("free_var", sym.free_var);
  flags.set_attribute_bool("statevar", sym.is_state_var);

  xmlt &mode = flags.new_element("mode");
  mode.data = id2string(sym.mode);

  flags.new_element("base_name").data=id2string(sym.base_name);
  flags.new_element("module").data=id2string(sym.module);

  if (sym.pretty_name.size()>0)
    flags.new_element("pretty_name").data=id2string(sym.pretty_name);

  xmlt &xmlloc = xmlsym.new_element("location");
  convert(sym.location, xmlloc);
  xmlloc.name = "location"; // convert overwrote this
}
Esempio n. 3
0
void convert(const goto_programt &goto_program,
             xmlt &xml)
{
  std::stringstream tmp;
  // std::cout << "TNO: " << goto_program.target_numbers.size() << std::endl;

  for(const auto &inst : goto_program.instructions)
  {
    xmlt &ins=xml.new_element("instruction");

    if(!inst.location.is_nil())
    {
      convert(inst.location, ins.new_element("location"));
    }

    if(!inst.labels.empty())
    {
      xmlt &lbl=ins.new_element("labels");
      for(goto_programt::instructiont::labelst::const_iterator
          l_it=inst.labels.begin();
          l_it!=inst.labels.end();
          l_it++)
      {
        lbl.new_element("label").set_attribute("name", id2string(*l_it));
      }
    }


    if(inst.target_number!=0)
    {
      // std::cout << "Targetlabel found!" << std::endl;
      tmp.str("");
      tmp << inst.target_number;
      ins.set_attribute("targetlabel", tmp.str());
    }

    switch(inst.type)
    {
        case GOTO:
        {
          ins.name="goto";
          if(!inst.guard.is_true())
          {
            xmlt &g=ins.new_element("guard");
            convert(inst.guard, g);
          }
          xmlt &tgt=ins.new_element("targets");
          for(goto_programt::instructiont::targetst::const_iterator
              gt_it=inst.targets.begin();
              gt_it!=inst.targets.end();
              gt_it++)
          {
            tmp.str("");
            tmp << (*gt_it)->target_number;
            tgt.new_element("target").data=tmp.str();
          }
          break;
        }

        case ASSUME:
        {
          ins.name="assume";
          xmlt &g=ins.new_element("guard");
          convert(inst.guard, g);

          const irep_idt &comment=inst.location.get("comment");

          if(comment!="")
            ins.new_element("comment").data=id2string(comment);

          break;
        }

        case ASSERT:
        {
          ins.name="assert";
          xmlt &g=ins.new_element("guard");
          convert(inst.guard, g);
          const irep_idt &comment=inst.location.get("comment");

          if(comment!="")
            ins.new_element("comment").data=id2string(comment);

          break;
        }

        case SKIP:
        ins.name="skip";
        break;

        case END_FUNCTION:
        ins.name="end_function";
        break;

        case LOCATION:
        ins.name="location";
        break;

        case DEAD:
        ins.name="dead";
        break;

        case ATOMIC_BEGIN:
        ins.name="atomic_begin";
        break;

        case ATOMIC_END:
        ins.name="atomic_end";
        break;

        case RETURN:
        {
          ins.name="return";
          xmlt &c=ins.new_element("code");
          convert(inst.code, c);
          break;
        }

        case OTHER:
        {
          ins.name="instruction";
          xmlt &c=ins.new_element("code");
          convert(inst.code, c);
          break;
        }

        case ASSIGN:
        {
          ins.name="assign";
          xmlt &c=ins.new_element("code");
          convert(inst.code, c);
          break;
        }

        case FUNCTION_CALL:
        {
          ins.name="functioncall";
          xmlt &c=ins.new_element("code");
          convert(inst.code, c);
          break;
        }

        case START_THREAD:
        {
          ins.name="thread_start";
          xmlt &tgt=ins.new_element("targets");
          if(inst.targets.size()==1)
          {
            tmp.str("");
            tmp << inst.targets.front()->target_number;
            tgt.new_element("target").data=tmp.str();
          }
          break;
        }

        case END_THREAD:
        ins.name="thread_end";
        break;

        default:
        ins.name="unknown";
        break;
    }

    if(inst.function!="")
    {
      xmlt &fnc=ins.new_element("function");
      fnc.data=id2string(inst.function);
    }
  }
}
Esempio n. 4
0
void convert(
  const namespacet &ns,
  const goto_tracet &goto_trace,
  xmlt &dest)
{
  dest=xmlt("goto_trace");

  source_locationt previous_source_location;

  for(const auto & it : goto_trace.steps)
  {
    const source_locationt &source_location=it.pc->source_location;

    xmlt xml_location;
    if(source_location.is_not_nil() && source_location.get_file()!="")
      xml_location=xml(source_location);

    switch(it.type)
    {
    case goto_trace_stept::ASSERT:
      if(!it.cond_value)
      {
        irep_idt property_id;

        if(it.pc->is_assert())
          property_id=source_location.get_property_id();
        else if(it.pc->is_goto()) // unwinding, we suspect
        {
          property_id=
            id2string(it.pc->source_location.get_function())+".unwind."+
            i2string(it.pc->loop_number);
        }

        xmlt &xml_failure=dest.new_element("failure");

        xml_failure.set_attribute_bool("hidden", it.hidden);
        xml_failure.set_attribute("thread", i2string(it.thread_nr));
        xml_failure.set_attribute("step_nr", i2string(it.step_nr));
        xml_failure.set_attribute("reason", id2string(it.comment));
        xml_failure.set_attribute("property", id2string(property_id));

        if(xml_location.name!="")
          xml_failure.new_element().swap(xml_location);
      }
      break;

    case goto_trace_stept::ASSIGNMENT:
    case goto_trace_stept::DECL:
      {
        irep_idt identifier=it.lhs_object.get_identifier();
        xmlt &xml_assignment=dest.new_element("assignment");

        if(xml_location.name!="")
          xml_assignment.new_element().swap(xml_location);

        std::string value_string, binary_string, type_string,
                    full_lhs_string, full_lhs_value_string;

        if(it.lhs_object_value.is_not_nil())
          value_string=from_expr(ns, identifier, it.lhs_object_value);

        if(it.full_lhs.is_not_nil())
          full_lhs_string=from_expr(ns, identifier, it.full_lhs);

        if(it.full_lhs_value.is_not_nil())
          full_lhs_value_string=from_expr(ns, identifier, it.full_lhs_value);

        if(it.lhs_object_value.type().is_not_nil())
          type_string=from_type(ns, identifier, it.lhs_object_value.type());

        const symbolt *symbol;
        irep_idt base_name, display_name;

        if(!ns.lookup(identifier, symbol))
        {
          base_name=symbol->base_name;
          display_name=symbol->display_name();
          if(type_string=="")
            type_string=from_type(ns, identifier, symbol->type);

          xml_assignment.set_attribute("mode", id2string(symbol->mode));
        }

        xml_assignment.new_element("type").data=type_string;
        xml_assignment.new_element("full_lhs").data=full_lhs_string;
        xml_assignment.new_element("full_lhs_value").data=full_lhs_value_string;
        xml_assignment.new_element("value").data=value_string;

        xml_assignment.set_attribute_bool("hidden", it.hidden);
        xml_assignment.set_attribute("thread", i2string(it.thread_nr));
        xml_assignment.set_attribute("identifier", id2string(identifier));
        xml_assignment.set_attribute("base_name", id2string(base_name));
        xml_assignment.set_attribute("display_name", id2string(display_name));
        xml_assignment.set_attribute("step_nr", i2string(it.step_nr));

        xml_assignment.set_attribute("assignment_type",
          it.assignment_type==goto_trace_stept::ACTUAL_PARAMETER?"actual_parameter":
          "state");

        if(it.lhs_object_value.is_not_nil())
          xml_assignment.new_element("value_expression").new_element(xml(it.lhs_object_value, ns));
      }
      break;

    case goto_trace_stept::OUTPUT:
      {
        printf_formattert printf_formatter(ns);
        printf_formatter(id2string(it.format_string), it.io_args);
        std::string text=printf_formatter.as_string();
        xmlt &xml_output=dest.new_element("output");

        xml_output.new_element("text").data=text;

        xml_output.set_attribute_bool("hidden", it.hidden);
        xml_output.set_attribute("thread", i2string(it.thread_nr));
        xml_output.set_attribute("step_nr", i2string(it.step_nr));

        if(xml_location.name!="")
          xml_output.new_element().swap(xml_location);

        for(const auto l_it : it.io_args)
        {
          xml_output.new_element("value").data=from_expr(ns, "", l_it);
          xml_output.new_element("value_expression").
            new_element(xml(l_it, ns));
        }
      }
      break;

    case goto_trace_stept::INPUT:
      {
        xmlt &xml_input=dest.new_element("input");
        xml_input.new_element("input_id").data=id2string(it.io_id);

        xml_input.set_attribute_bool("hidden", it.hidden);
        xml_input.set_attribute("thread", i2string(it.thread_nr));
        xml_input.set_attribute("step_nr", i2string(it.step_nr));

        for(const auto & l_it : it.io_args)
        {
          xml_input.new_element("value").data=from_expr(ns, "", l_it);
          xml_input.new_element("value_expression").
            new_element(xml(l_it, ns));
        }

        if(xml_location.name!="")
          xml_input.new_element().swap(xml_location);
      }
      break;

    case goto_trace_stept::FUNCTION_CALL:
    case goto_trace_stept::FUNCTION_RETURN:
      {
        std::string tag=
          (it.type==goto_trace_stept::FUNCTION_CALL)?"function_call":"function_return";
        xmlt &xml_call_return=dest.new_element(tag);

        xml_call_return.set_attribute_bool("hidden", it.hidden);
        xml_call_return.set_attribute("thread", i2string(it.thread_nr));
        xml_call_return.set_attribute("step_nr", i2string(it.step_nr));

        const symbolt &symbol=ns.lookup(it.identifier);
        xmlt &xml_function=xml_call_return.new_element("function");
        xml_function.set_attribute("display_name", id2string(symbol.display_name()));
        xml_function.set_attribute("identifier", id2string(it.identifier));
        xml_function.new_element()=xml(symbol.location);

        if(xml_location.name!="")
          xml_call_return.new_element().swap(xml_location);
      }
      break;

    default:
      if(source_location!=previous_source_location)
      {
        // just the source location
        if(xml_location.name!="")
        {
          xmlt &xml_location_only=dest.new_element("location-only");

          xml_location_only.set_attribute_bool("hidden", it.hidden);
          xml_location_only.set_attribute("thread", i2string(it.thread_nr));
          xml_location_only.set_attribute("step_nr", i2string(it.step_nr));

          xml_location_only.new_element().swap(xml_location);
        }
      }
    }

    if(source_location.is_not_nil() && source_location.get_file()!="")
      previous_source_location=source_location;
  }
}