Example #1
0
void Pass::execute() {
  FileSetBlock *fsb = _suif_env->get_file_set_block();
  if (fsb == NULL)
    suif_warning("%s: Pass execution attempted without a file set block\n",
		 get_module_name().c_str());
  else
    do_file_set_block( fsb );
}
Example #2
0
void SuifCFGraphPass::do_procedure_definition(ProcedureDefinition *proc_def )
  {
    CFGraphQuery q(get_suif_env(), proc_def);

    //    bool verbose = _verbose_output->is_set();
    bool dot_output = _dot_output->is_set();
    if (dot_output) {
      const char *fname = 
	(String(proc_def->get_procedure_symbol()->get_name()) + ".dot").c_str();
      FILE *fp = fopen(fname, "w");
      if (!fp) {
	suif_warning("Could not open file '%s'\n", fname);
      } else {
	file_ion the_ion(fp);
	q.print_dot(&the_ion);
	fclose(fp);
      }
    }
  }
Example #3
0
/*
#define NO_IMMED_DOM ((size_t)-1)
array_tos<SGraphNode> *build_immediate_dominators(
			    const SGraph *reachable,
			    const SGraph *domination,
			    tos<SGraphNode> *rev_postord_list,
			    SGraphNode root,
			    bool do_forward) {
			    */
void build_immediate_dominators(SGraph *immed_doms,
                                const SGraph *reachable,
                                const SGraph *domination,
                                SGraphNodeList *rev_postord_list,
                                SGraphNode root,
                                bool do_forward) {
    //unsigned num = reachable->max_num_nodes();
    //  unsigned root = (forward ? entry_node()->number() : exit_node()->number());
    //  Bit_set *d = (forward ? doms : pdoms);
    /*
    array_tos<SGraphNode> *immed_doms =
      new array_tos<SGraphNode>;
    for (unsigned i = 0; i < num; i++) {
      //  cfgraph_node **im = new cfgraph_node*[num];
      immed_doms->set_elem(i, NO_IMMED_DOM);

      //  im[root] = NULL;
    }
    */
    // Iterate over all of the nodes
    for (SNodeIter iter(domination->get_node_iterator());
            !iter.done(); iter.increment()) {

        //  for (unsigned n = 0; n < num; n++) {
        SGraphNode current_node = iter.get();

        /* the root node has no dominators */
        if (current_node == root) continue;

        /* remove self for comparison */
        //    domination->remove_edge(n, n);
        //    d[n].remove(n);

        /* check nodes in dominator set */
        bool found = false;

        // iterate over all of the possible predecessors
        for (SNodeIter iter2(domination->get_node_iterator());
                !iter2.done(); iter2.increment()) {

            //    bit_set_iter diter(&d[n]);
            //    while (!diter.is_empty()) {
            SGraphNode check_node = iter2.get();
            if (check_node == current_node) continue;

            // Now iterate over the successors of current_node and check_node
            // at the same time.  Ignore self.
            SNodeIter current_iter(domination->get_node_successor_iterator(current_node, do_forward));
            SNodeIter check_iter(domination->get_node_successor_iterator(check_node, do_forward));

            bool not_found = false;
            // The easier way:
            // get the first, remove it
            // then compare.
            for (; !current_iter.done() && !check_iter.done();
                    current_iter.increment(), check_iter.increment()) {

                //      while (!current_iter.done() &&
                //	     !check_iter.done()) {
                //	SGraphNode current_edge = current_iter.get();
                if (current_node == current_iter.get()) {
                    current_iter.increment();
                    if (current_iter.done()) break;
                }
                //	SGraphNode check_edge = check_iter.get();
                if (current_iter.get() != check_iter.get()) {
                    not_found = true;
                    break;
                }
            }
            if (!not_found &&
                    !current_iter.done() &&
                    check_iter.done()) {
                if (current_iter.get() == current_node) {
                    current_iter.increment();
                }
            }

            if (!not_found &&
                    current_iter.done() &&
                    check_iter.done()) {
                found = true;
                immed_doms->add_edge(SGraphEdge(current_node,check_node));
                break;
            }
        }

        if (!found) {
            suif_warning("can't find idom of node %u", current_node);
        }

    }
}
void EliminateArrayConvertsPass::do_procedure_definition(ProcedureDefinition* proc_def){
    suif_hash_map<ParameterSymbol*, Type*> params;
    TypeBuilder *tb = (TypeBuilder*)
         get_suif_env()->get_object_factory(TypeBuilder::get_class_name());

    // collect all procedure parameters of pointer type into params list
    for(Iter<ParameterSymbol*> iter = proc_def->get_formal_parameter_iterator();
        iter.is_valid(); iter.next())
    {
        ParameterSymbol* par_sym = iter.current();
        Type* par_type = tb->unqualify_type(par_sym->get_type());

        if(is_kind_of<PointerType>(par_type)){
            // put NULLs into the map at first,
            // they will later be overwritten
            params[par_sym] = NULL;
        }
    }
    if(params.size()==0) return;    // nothing to do
    
    // walk thru all AREs and look for arrays that are in the param list
    {for(Iter<ArrayReferenceExpression> iter =
        object_iterator<ArrayReferenceExpression>(proc_def);
            iter.is_valid(); iter.next())
        {
            ArrayReferenceExpression* are = &iter.current();
            if(is_kind_of<UnaryExpression>(are->get_base_array_address())){
                UnaryExpression* ue = to<UnaryExpression>(are->get_base_array_address());
                if(ue->get_opcode() == k_convert){
                    if(is_kind_of<LoadVariableExpression>(ue->get_source())){
                        LoadVariableExpression* lve = 
                            to<LoadVariableExpression>(ue->get_source());
                        VariableSymbol* array = lve->get_source();
            
                        for(suif_hash_map<ParameterSymbol*, Type*>::iterator iter = params.begin();
                            iter!=params.end();iter++)
                        {
                            ParameterSymbol* par_sym = (*iter).first;
                            if(par_sym == array){
                                // match!
                                Type* array_type;
                                suif_hash_map<ParameterSymbol*, Type*>::iterator iter =
                                    params.find(par_sym);
                                
                                if(iter==params.end() || (*iter).second==NULL){
                                    //array_type = to<PointerType>(ue->get_result_type())->get_reference_type();
                                    array_type = tb->get_qualified_type(ue->get_result_type());
                                    params[par_sym] = array_type;
                                    //printf("%s has type ",par_sym->get_name().c_str());
                                    //array_type->print_to_default();
                                }else{
                                    array_type = params[par_sym].second;
                                    suif_assert(is_kind_of<QualifiedType>(array_type));
                                }

                                array->replace(array->get_type(), array_type);
                                remove_suif_object(ue);
                                remove_suif_object(lve);
                                lve->replace(lve->get_result_type(), tb->unqualify_type(array_type));
                                // put the LoadVar directly under ARE
                                are->set_base_array_address(lve);
                                //are->print_to_default();
                            }
                        }
                    } else {
                        suif_warning(ue->get_source(),
                            ("Expecting a LoadVariableExpression here"));
                    }
                } else {
                    suif_warning(ue, ("Disallow converts in AREs for "
                            "things other than procedure parameters"));
                }
            }
        }
    }
}