X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbera.c;h=5079570fc3da21122d1f0e7bb330d00a4411404f;hb=a4d19ce531ca3bb1da8703762f5120f8d9c4764f;hp=7bddee0c00ff504278f96f19db6210a8fb76702f;hpb=9b060a71a2667ced8d103023eda0ff710e799867;p=libfirm diff --git a/ir/be/bera.c b/ir/be/bera.c index 7bddee0c0..5079570fc 100644 --- a/ir/be/bera.c +++ b/ir/be/bera.c @@ -1,25 +1,70 @@ +/* + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + /** - * Base routines for register allocation. - * @author Sebastian Hack - * @date 22.11.2004 + * @file + * @brief Base routines for register allocation. + * @author Sebastian Hack + * @date 22.11.2004 + * @version $Id$ */ +#include "config.h" + +#include #include "pset.h" -#include "impl.h" #include "irnode.h" #include "irmode.h" +#include "irdom.h" +#include "iredges.h" + +#include "bera.h" +#include "beutil.h" #include "besched.h" +#include "belive_t.h" +#include "bemodule.h" -#include "bera_t.h" +/** The list of register allocators */ +static be_module_list_entry_t *register_allocators = NULL; +static be_ra_t *selected_allocator = NULL; -FIRM_IMPL1(is_allocatable_irn, int, const ir_node *) +void be_register_allocator(const char *name, be_ra_t *allocator) +{ + if (selected_allocator == NULL) + selected_allocator = allocator; + be_add_module_to_list(®ister_allocators, name, allocator); +} -size_t ra_irn_data_offset = 0; -size_t ra_irg_data_offset = 0; +void be_allocate_registers(ir_graph *irg) +{ + assert(selected_allocator != NULL); + if (selected_allocator != NULL) { + selected_allocator->allocate(irg); + } +} -void be_ra_init(void) +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_ra); +void be_init_ra(void) { - ra_irn_data_offset = register_additional_node_data(sizeof(ra_info_t)); - ra_irg_data_offset = register_additional_graph_data(sizeof(void *)); + lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be"); + + be_add_module_list_opt(be_grp, "regalloc", "register allocator", + ®ister_allocators, (void**) &selected_allocator); }