bemain: Centrally call be_gas_end_compilation_unit() and be_emit_exit() instead of...
[libfirm] / ir / be / amd64 / bearch_amd64.c
index d15d664..3e9332e 100644 (file)
 
 #include "bitset.h"
 #include "debug.h"
+#include "error.h"
 
-#include "be.h"
+#include "be_t.h"
 #include "bearch.h"
+#include "beirg.h"
 #include "benode.h"
 #include "belower.h"
 #include "besched.h"
@@ -110,7 +112,6 @@ static const arch_irn_ops_t amd64_irn_ops = {
        amd64_get_frame_entity,
        amd64_set_frame_offset,
        amd64_get_sp_bias,
-       NULL,    /* get_inverse             */
        NULL,    /* get_op_estimated_cost   */
        NULL,    /* possible_memory_operand */
        NULL,    /* perform_memory_operand  */
@@ -124,10 +125,9 @@ static const arch_irn_ops_t amd64_irn_ops = {
  */
 static void amd64_prepare_graph(ir_graph *irg)
 {
-       amd64_irg_data_t *irg_data = amd64_get_irg_data(irg);
        amd64_transform_graph(irg);
 
-       if (irg_data->dump)
+       if (be_options.dump_flags & DUMP_BE)
                dump_ir_graph(irg, "transformed");
 }
 
@@ -203,7 +203,7 @@ static void amd64_after_ra_walker(ir_node *block, void *data)
 
 static void amd64_set_frame_entity(ir_node *node, ir_entity *entity)
 {
-       assert(be_is_Reload(node));
+       assert(be_is_Reload(node) || be_is_Spill(node));
        be_node_set_frame_entity(node, entity);
 }
 
@@ -241,41 +241,6 @@ static void amd64_finish_irg(ir_graph *irg)
        be_abi_fix_stack_bias(irg);
 }
 
-/**
- * Initializes the code generator.
- */
-static void amd64_init_graph(ir_graph *irg)
-{
-       struct obstack   *obst     = be_get_be_obst(irg);
-       amd64_irg_data_t *irg_data = OALLOCZ(obst, amd64_irg_data_t);
-       irg_data->dump = (be_options.dump_flags & DUMP_BE) ? 1 : 0;
-
-       be_birg_from_irg(irg)->isa_link = irg_data;
-}
-
-
-typedef ir_node *(*create_const_node_func) (dbg_info *dbg, ir_node *block);
-
-/**
- * Used to create per-graph unique pseudo nodes.
- */
-static inline ir_node *create_const(ir_graph *irg, ir_node **place,
-                                    create_const_node_func func,
-                                    const arch_register_t* reg)
-{
-       ir_node *block, *res;
-
-       if (*place != NULL)
-               return *place;
-
-       block = get_irg_start_block(irg);
-       res = func(NULL, block);
-       arch_set_irn_register(res, reg);
-       *place = res;
-
-       return res;
-}
-
 extern const arch_isa_if_t amd64_isa_if;
 static amd64_isa_t amd64_isa_template = {
        {
@@ -284,14 +249,12 @@ static amd64_isa_t amd64_isa_template = {
                amd64_registers,
                N_AMD64_CLASSES,
                amd64_reg_classes,
-               &amd64_registers[REG_RSP],  /* stack pointer register */
-               &amd64_registers[REG_RBP],  /* base pointer register */
-               &amd64_reg_classes[CLASS_amd64_gp],  /* link pointer register class */
-               3,                           /* power of two stack alignment for calls, 2^2 == 4 */
-               NULL,                        /* main environment */
-               7,                           /* costs for a spill instruction */
-               5,                           /* costs for a reload instruction */
-               false,                       /* no custom abi handling */
+               &amd64_registers[REG_RSP], /* stack pointer register */
+               &amd64_registers[REG_RBP], /* base pointer register */
+               3,                         /* power of two stack alignment for calls, 2^2 == 4 */
+               7,                         /* costs for a spill instruction */
+               5,                         /* costs for a reload instruction */
+               false,                     /* no custom abi handling */
        },
 };
 
@@ -306,14 +269,11 @@ static void amd64_finish(void)
        amd64_free_opcodes();
 }
 
-static arch_env_t *amd64_begin_codegeneration(const be_main_env_t *env)
+static arch_env_t *amd64_begin_codegeneration(void)
 {
        amd64_isa_t *isa = XMALLOC(amd64_isa_t);
        *isa = amd64_isa_template;
 
-       be_emit_init(env->file_handle);
-       be_gas_begin_compilation_unit(env);
-
        return &isa->base;
 }
 
@@ -322,12 +282,6 @@ static arch_env_t *amd64_begin_codegeneration(const be_main_env_t *env)
  */
 static void amd64_end_codegeneration(void *self)
 {
-       amd64_isa_t *isa = (amd64_isa_t*)self;
-
-       /* emit now all global declarations */
-       be_gas_end_compilation_unit(isa->base.main_env);
-
-       be_emit_exit();
        free(self);
 }
 
@@ -389,13 +343,11 @@ static void amd64_get_call_abi(ir_type *method_type, be_abi_call_t *abi)
        ir_type  *tp;
        ir_mode  *mode;
        int       i, n = get_method_n_params(method_type);
-       be_abi_call_flags_t call_flags;
        int no_reg = 0;
 
        /* set abi flags for calls */
-       call_flags.bits.call_has_imm = true;
-
-       /* set stack parameter passing style */
+       be_abi_call_flags_t call_flags = be_abi_call_get_flags(abi);
+       call_flags.call_has_imm = true;
        be_abi_call_set_flags(abi, call_flags, &amd64_abi_callbacks);
 
        for (i = 0; i < n; i++) {
@@ -420,9 +372,8 @@ static void amd64_get_call_abi(ir_type *method_type, be_abi_call_t *abi)
                tp   = get_method_res_type(method_type, 0);
                mode = get_type_mode(tp);
 
-               /* FIXME: No floating point yet */
-               /* be_abi_call_res_reg(abi, 0,
-                       mode_is_float(mode) ? &amd64_fp_regs[REG_F0] : &amd64_registers[REG_R0], ABI_CONTEXT_BOTH); */
+               if (mode_is_float(mode))
+                       panic("float not supported yet");
 
                be_abi_call_res_reg(abi, 0,
                        &amd64_registers[REG_RAX], ABI_CONTEXT_BOTH);
@@ -541,7 +492,7 @@ const arch_isa_if_t amd64_isa_if = {
 
        amd64_begin_codegeneration,
        amd64_end_codegeneration,
-       amd64_init_graph,
+       NULL,
        amd64_get_call_abi,
        NULL,              /* mark remat */
        NULL,              /* get_pic_base */