X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbera.c;h=8d15ac7c6620be3b5fcee72bb36a656813c7c094;hb=952e0be71291f6475cb4c86894e43dc531eb8980;hp=7bddee0c00ff504278f96f19db6210a8fb76702f;hpb=9b060a71a2667ced8d103023eda0ff710e799867;p=libfirm diff --git a/ir/be/bera.c b/ir/be/bera.c index 7bddee0c0..8d15ac7c6 100644 --- a/ir/be/bera.c +++ b/ir/be/bera.c @@ -1,25 +1,73 @@ +/* + * 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$ */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include #include "pset.h" #include "impl.h" #include "irnode.h" #include "irmode.h" -#include "besched.h" +#include "irdom.h" +#include "iredges.h" -#include "bera_t.h" +#include "bera.h" +#include "beutil.h" +#include "besched_t.h" +#include "belive_t.h" +#include "bemodule.h" -FIRM_IMPL1(is_allocatable_irn, int, const ir_node *) +/** The list of register allocators */ +static be_module_list_entry_t *register_allocators = NULL; +static be_ra_t *selected_allocator = NULL; -size_t ra_irn_data_offset = 0; -size_t ra_irg_data_offset = 0; +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); +} -void be_ra_init(void) +void be_allocate_registers(be_irg_t *birg) { - ra_irn_data_offset = register_additional_node_data(sizeof(ra_info_t)); - ra_irg_data_offset = register_additional_graph_data(sizeof(void *)); + assert(selected_allocator != NULL); + if(selected_allocator != NULL) { + selected_allocator->allocate(birg); + } +} + +void be_init_ra(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); } +BE_REGISTER_MODULE_CONSTRUCTOR(init_be_ra);