Commit 194f0e40 authored by Matthias Braun's avatar Matthias Braun
Browse files

use begnuas to emit block labels so we use the correct private prefix on mac and linux

[r27149]
parent bf9be89c
...@@ -134,8 +134,7 @@ void TEMPLATE_emit_dest_register(const ir_node *node, int pos) ...@@ -134,8 +134,7 @@ void TEMPLATE_emit_dest_register(const ir_node *node, int pos)
static void TEMPLATE_emit_cfop_target(const ir_node *node) static void TEMPLATE_emit_cfop_target(const ir_node *node)
{ {
ir_node *block = get_irn_link(node); ir_node *block = get_irn_link(node);
be_gas_emit_block_name(block);
be_emit_irprintf("BLOCK_%ld", get_irn_node_nr(block));
} }
/*********************************************************************************** /***********************************************************************************
...@@ -219,8 +218,8 @@ void TEMPLATE_gen_block(ir_node *block, void *data) ...@@ -219,8 +218,8 @@ void TEMPLATE_gen_block(ir_node *block, void *data)
if (! is_Block(block)) if (! is_Block(block))
return; return;
be_emit_cstring("BLOCK_"); be_gas_emit_block_name(block);
be_emit_irprintf("%ld:\n", get_irn_node_nr(block)); be_emit_cstring(":\n");
be_emit_write_line(); be_emit_write_line();
sched_foreach(block, node) { sched_foreach(block, node) {
......
...@@ -57,7 +57,6 @@ ...@@ -57,7 +57,6 @@
#include "../benode.h" #include "../benode.h"
#define BLOCK_PREFIX ".L"
#define SNPRINTF_BUF_LEN 128 #define SNPRINTF_BUF_LEN 128
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
...@@ -417,20 +416,6 @@ static ir_node *get_cfop_target_block(const ir_node *irn) ...@@ -417,20 +416,6 @@ static ir_node *get_cfop_target_block(const ir_node *irn)
return get_irn_link(irn); return get_irn_link(irn);
} }
/**
* Emits a block label for the given block.
*/
static void arm_emit_block_name(const ir_node *block)
{
if (has_Block_entity(block)) {
ir_entity *entity = get_Block_entity(block);
be_gas_emit_entity(entity);
} else {
be_emit_cstring(BLOCK_PREFIX);
be_emit_irprintf("%d", get_irn_node_nr(block));
}
}
/** /**
* Emit the target label for a control flow node. * Emit the target label for a control flow node.
*/ */
...@@ -438,7 +423,7 @@ static void arm_emit_cfop_target(const ir_node *irn) ...@@ -438,7 +423,7 @@ static void arm_emit_cfop_target(const ir_node *irn)
{ {
ir_node *block = get_cfop_target_block(irn); ir_node *block = get_cfop_target_block(irn);
arm_emit_block_name(block); be_gas_emit_block_name(block);
} }
/** /**
...@@ -1060,7 +1045,7 @@ static void arm_emit_block_header(ir_node *block, ir_node *prev) ...@@ -1060,7 +1045,7 @@ static void arm_emit_block_header(ir_node *block, ir_node *prev)
} }
if (need_label) { if (need_label) {
arm_emit_block_name(block); be_gas_emit_block_name(block);
be_emit_char(':'); be_emit_char(':');
be_emit_pad_comment(); be_emit_pad_comment();
...@@ -1074,7 +1059,7 @@ static void arm_emit_block_header(ir_node *block, ir_node *prev) ...@@ -1074,7 +1059,7 @@ static void arm_emit_block_header(ir_node *block, ir_node *prev)
} }
} else { } else {
be_emit_cstring("\t/* "); be_emit_cstring("\t/* ");
arm_emit_block_name(block); be_gas_emit_block_name(block);
be_emit_cstring(": "); be_emit_cstring(": ");
} }
if (exec_freq != NULL) { if (exec_freq != NULL) {
......
...@@ -2108,11 +2108,11 @@ static ir_entity *create_trampoline(be_main_env_t *be, ir_entity *method) ...@@ -2108,11 +2108,11 @@ static ir_entity *create_trampoline(be_main_env_t *be, ir_entity *method)
{ {
ir_type *type = get_entity_type(method); ir_type *type = get_entity_type(method);
ident *old_id = get_entity_ld_ident(method); ident *old_id = get_entity_ld_ident(method);
ident *id = id_mangle3("L", old_id, "$stub"); ident *id = id_mangle3("", old_id, "$stub");
ir_type *parent = be->pic_trampolines_type; ir_type *parent = be->pic_trampolines_type;
ir_entity *ent = new_entity(parent, old_id, type); ir_entity *ent = new_entity(parent, old_id, type);
set_entity_ld_ident(ent, id); set_entity_ld_ident(ent, id);
set_entity_visibility(ent, ir_visibility_local); set_entity_visibility(ent, ir_visibility_private);
return ent; return ent;
} }
...@@ -2134,13 +2134,13 @@ static ir_entity *get_trampoline(be_main_env_t *env, ir_entity *method) ...@@ -2134,13 +2134,13 @@ static ir_entity *get_trampoline(be_main_env_t *env, ir_entity *method)
static ir_entity *create_pic_symbol(be_main_env_t *be, ir_entity *entity) static ir_entity *create_pic_symbol(be_main_env_t *be, ir_entity *entity)
{ {
ident *old_id = get_entity_ld_ident(entity); ident *old_id = get_entity_ld_ident(entity);
ident *id = id_mangle3("L", old_id, "$non_lazy_ptr"); ident *id = id_mangle3("", old_id, "$non_lazy_ptr");
ir_type *e_type = get_entity_type(entity); ir_type *e_type = get_entity_type(entity);
ir_type *type = new_type_pointer(e_type); ir_type *type = new_type_pointer(e_type);
ir_type *parent = be->pic_symbols_type; ir_type *parent = be->pic_symbols_type;
ir_entity *ent = new_entity(parent, old_id, type); ir_entity *ent = new_entity(parent, old_id, type);
set_entity_ld_ident(ent, id); set_entity_ld_ident(ent, id);
set_entity_visibility(ent, ir_visibility_local); set_entity_visibility(ent, ir_visibility_private);
return ent; return ent;
} }
......
...@@ -572,14 +572,6 @@ static void emit_arith_tarval(tarval *tv, int bytes) ...@@ -572,14 +572,6 @@ static void emit_arith_tarval(tarval *tv, int bytes)
panic("Can't dump a tarval with %d bytes", bytes); panic("Can't dump a tarval with %d bytes", bytes);
} }
/**
* Return the label prefix for labeled blocks.
*/
const char *be_gas_block_label_prefix(void)
{
return ".LG";
}
/** /**
* Return the label prefix for labeled instructions. * Return the label prefix for labeled instructions.
*/ */
...@@ -1373,7 +1365,7 @@ static void emit_indirect_symbol(const ir_entity *entity, be_gas_section_t secti ...@@ -1373,7 +1365,7 @@ static void emit_indirect_symbol(const ir_entity *entity, be_gas_section_t secti
/* we can only do PIC code on macho so far */ /* we can only do PIC code on macho so far */
assert(be_gas_object_file_format == OBJECT_FILE_FORMAT_MACH_O); assert(be_gas_object_file_format == OBJECT_FILE_FORMAT_MACH_O);
be_emit_ident(get_entity_ld_ident(entity)); be_gas_emit_entity(entity);
be_emit_cstring(":\n"); be_emit_cstring(":\n");
be_emit_write_line(); be_emit_write_line();
be_emit_cstring("\t.indirect_symbol "); be_emit_cstring("\t.indirect_symbol ");
...@@ -1390,21 +1382,41 @@ static void emit_indirect_symbol(const ir_entity *entity, be_gas_section_t secti ...@@ -1390,21 +1382,41 @@ static void emit_indirect_symbol(const ir_entity *entity, be_gas_section_t secti
} }
} }
static void emit_private_prefix(void)
{
if (be_gas_object_file_format == OBJECT_FILE_FORMAT_MACH_O) {
be_emit_char('L');
} else {
be_emit_cstring(".L");
}
}
void be_gas_emit_entity(const ir_entity *entity) void be_gas_emit_entity(const ir_entity *entity)
{ {
if (entity->type == firm_code_type) { if (entity->type == firm_code_type) {
ir_label_t label = get_entity_label(entity); ir_label_t label = get_entity_label(entity);
be_emit_string(be_gas_block_label_prefix()); emit_private_prefix();
be_emit_irprintf("%lu", label); be_emit_irprintf("_%lu", label);
return; return;
} }
if (get_entity_visibility(entity) == ir_visibility_private) { if (get_entity_visibility(entity) == ir_visibility_private) {
be_emit_cstring(".L"); emit_private_prefix();
} }
be_emit_ident(get_entity_ld_ident(entity)); be_emit_ident(get_entity_ld_ident(entity));
} }
void be_gas_emit_block_name(const ir_node *block)
{
if (has_Block_entity(block)) {
ir_entity *entity = get_Block_entity(block);
be_gas_emit_entity(entity);
} else {
emit_private_prefix();
be_emit_irprintf("%ld", get_irn_node_nr(block));
}
}
/** /**
* Dump a global entity. * Dump a global entity.
* *
......
...@@ -94,9 +94,9 @@ void be_gas_emit_function_epilog(const ir_entity *entity); ...@@ -94,9 +94,9 @@ void be_gas_emit_function_epilog(const ir_entity *entity);
void be_gas_emit_entity(const ir_entity *entity); void be_gas_emit_entity(const ir_entity *entity);
/** /**
* Return the label prefix for labeled blocks. * Emit (a private) symbol name for a firm block
*/ */
const char *be_gas_block_label_prefix(void); void be_gas_emit_block_name(const ir_node *block);
/** /**
* Return the label prefix for labeled instructions. * Return the label prefix for labeled instructions.
......
...@@ -80,8 +80,6 @@ ...@@ -80,8 +80,6 @@
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
#define BLOCK_PREFIX ".L"
#define SNPRINTF_BUF_LEN 128 #define SNPRINTF_BUF_LEN 128
static const ia32_isa_t *isa; static const ia32_isa_t *isa;
...@@ -509,27 +507,13 @@ static ir_node *get_cfop_target_block(const ir_node *irn) ...@@ -509,27 +507,13 @@ static ir_node *get_cfop_target_block(const ir_node *irn)
return get_irn_link(irn); return get_irn_link(irn);
} }
/**
* Emits a block label for the given block.
*/
static void ia32_emit_block_name(const ir_node *block)
{
if (has_Block_entity(block)) {
ir_entity *entity = get_Block_entity(block);
be_gas_emit_entity(entity);
} else {
be_emit_cstring(BLOCK_PREFIX);
be_emit_irprintf("%ld", get_irn_node_nr(block));
}
}
/** /**
* Emits the target label for a control flow node. * Emits the target label for a control flow node.
*/ */
static void ia32_emit_cfop_target(const ir_node *node) static void ia32_emit_cfop_target(const ir_node *node)
{ {
ir_node *block = get_cfop_target_block(node); ir_node *block = get_cfop_target_block(node);
ia32_emit_block_name(block); be_gas_emit_block_name(block);
} }
/* /*
...@@ -1890,10 +1874,14 @@ static void emit_ia32_ClimbFrame(const ir_node *node) ...@@ -1890,10 +1874,14 @@ static void emit_ia32_ClimbFrame(const ir_node *node)
ia32_emitf(node, "\tmovl %S0, %D0\n"); ia32_emitf(node, "\tmovl %S0, %D0\n");
ia32_emitf(node, "\tmovl $%u, %S1\n", attr->count); ia32_emitf(node, "\tmovl $%u, %S1\n", attr->count);
ia32_emitf(NULL, BLOCK_PREFIX "%ld:\n", get_irn_node_nr(node)); be_gas_emit_block_name(node);
be_emit_cstring(":\n");
be_emit_write_line();
ia32_emitf(node, "\tmovl (%D0), %D0\n"); ia32_emitf(node, "\tmovl (%D0), %D0\n");
ia32_emitf(node, "\tdec %S1\n"); ia32_emitf(node, "\tdec %S1\n");
ia32_emitf(node, "\tjnz " BLOCK_PREFIX "%ld\n", get_irn_node_nr(node)); be_emit_cstring("\tjnz ");
be_gas_emit_block_name(node);
be_emit_finish_line_gas(node);
} }
static void emit_be_Return(const ir_node *node) static void emit_be_Return(const ir_node *node)
...@@ -2149,14 +2137,14 @@ static void ia32_emit_block_header(ir_node *block) ...@@ -2149,14 +2137,14 @@ static void ia32_emit_block_header(ir_node *block)
} }
if (need_label) { if (need_label) {
ia32_emit_block_name(block); be_gas_emit_block_name(block);
be_emit_char(':'); be_emit_char(':');
be_emit_pad_comment(); be_emit_pad_comment();
be_emit_cstring(" /* "); be_emit_cstring(" /* ");
} else { } else {
be_emit_cstring("\t/* "); be_emit_cstring("\t/* ");
ia32_emit_block_name(block); be_gas_emit_block_name(block);
be_emit_cstring(": "); be_emit_cstring(": ");
} }
...@@ -2301,7 +2289,7 @@ void ia32_gen_routine(ia32_code_gen_t *ia32_cg, ir_graph *irg) ...@@ -2301,7 +2289,7 @@ void ia32_gen_routine(ia32_code_gen_t *ia32_cg, ir_graph *irg)
ia32_emit_exc_label(exc_list[i].exc_instr); ia32_emit_exc_label(exc_list[i].exc_instr);
be_emit_char('\n'); be_emit_char('\n');
be_emit_cstring("\t.long "); be_emit_cstring("\t.long ");
ia32_emit_block_name(exc_list[i].block); be_gas_emit_block_name(exc_list[i].block);
be_emit_char('\n'); be_emit_char('\n');
} }
} }
...@@ -2451,7 +2439,7 @@ static void bemit_entity(ir_entity *entity, bool entity_sign, int offset, ...@@ -2451,7 +2439,7 @@ static void bemit_entity(ir_entity *entity, bool entity_sign, int offset,
static void bemit_jmp_destination(const ir_node *dest_block) static void bemit_jmp_destination(const ir_node *dest_block)
{ {
be_emit_cstring("\t.long "); be_emit_cstring("\t.long ");
ia32_emit_block_name(dest_block); be_gas_emit_block_name(dest_block);
be_emit_cstring(" - . - 4\n"); be_emit_cstring(" - . - 4\n");
be_emit_write_line(); be_emit_write_line();
} }
......
...@@ -52,8 +52,6 @@ ...@@ -52,8 +52,6 @@
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
#define BLOCK_PREFIX ".L"
#define SNPRINTF_BUF_LEN 128 #define SNPRINTF_BUF_LEN 128
/** /**
...@@ -410,36 +408,13 @@ static void mips_emit_Call(const ir_node *node) ...@@ -410,36 +408,13 @@ static void mips_emit_Call(const ir_node *node)
* |_| * |_|
************************************************************************/ ************************************************************************/
const char* mips_get_block_label(const ir_node* block)
{
static char buf[64];
snprintf(buf, sizeof(buf), "BLOCK_%ld", get_irn_node_nr(block));
return buf;
}
/**
* Emits a block label from the given block.
*/
static void mips_emit_block_label(const ir_node *block)
{
if (has_Block_entity(block)) {
ir_entity *entity = get_Block_entity(block);
be_gas_emit_entity(entity);
} else {
be_emit_cstring(BLOCK_PREFIX);
be_emit_irprintf("%ld", get_irn_node_nr(block));
}
}
static void mips_emit_Jump(const ir_node *node) static void mips_emit_Jump(const ir_node *node)
{ {
const ir_node *block = get_irn_link(node); const ir_node *block = get_irn_link(node);
assert(is_Block(block)); assert(is_Block(block));
be_emit_cstring("\tb "); be_emit_cstring("\tb ");
mips_emit_block_label(block); be_gas_emit_block_name(block);
be_emit_finish_line_gas(node); be_emit_finish_line_gas(node);
} }
...@@ -465,7 +440,7 @@ void mips_emit_jump_target_proj(const ir_node *node, long projn) ...@@ -465,7 +440,7 @@ void mips_emit_jump_target_proj(const ir_node *node, long projn)
ir_node *jumpblock = mips_get_jump_block(node, projn); ir_node *jumpblock = mips_get_jump_block(node, projn);
assert(jumpblock != NULL); assert(jumpblock != NULL);
mips_emit_block_label(jumpblock); be_gas_emit_block_name(jumpblock);
} }
void mips_emit_jump_target(const ir_node *node) void mips_emit_jump_target(const ir_node *node)
...@@ -473,7 +448,7 @@ void mips_emit_jump_target(const ir_node *node) ...@@ -473,7 +448,7 @@ void mips_emit_jump_target(const ir_node *node)
ir_node *jumpblock = get_irn_link(node); ir_node *jumpblock = get_irn_link(node);
assert(jumpblock != NULL); assert(jumpblock != NULL);
mips_emit_block_label(jumpblock); be_gas_emit_block_name(jumpblock);
} }
void mips_emit_jump_or_fallthrough(const ir_node *node, long pn) void mips_emit_jump_or_fallthrough(const ir_node *node, long pn)
...@@ -483,7 +458,7 @@ void mips_emit_jump_or_fallthrough(const ir_node *node, long pn) ...@@ -483,7 +458,7 @@ void mips_emit_jump_or_fallthrough(const ir_node *node, long pn)
/* TODO: use fallthrough when possible */ /* TODO: use fallthrough when possible */
be_emit_cstring("b "); be_emit_cstring("b ");
mips_emit_block_label(jumpblock); be_gas_emit_block_name(jumpblock);
} }
/************************************************************************ /************************************************************************
...@@ -593,7 +568,7 @@ void emit_mips_jump_table(const ir_node *irn) ...@@ -593,7 +568,7 @@ void emit_mips_jump_table(const ir_node *irn)
} }
be_emit_cstring("\t.word "); be_emit_cstring("\t.word ");
mips_emit_block_label(branch->target); be_gas_emit_block_name(branch->target);
be_emit_char('\n'); be_emit_char('\n');
be_emit_write_line(); be_emit_write_line();
...@@ -715,7 +690,7 @@ void mips_gen_block(const ir_node *block) ...@@ -715,7 +690,7 @@ void mips_gen_block(const ir_node *block)
if (! is_Block(block)) if (! is_Block(block))
return; return;
mips_emit_block_label(block); be_gas_emit_block_name(block);
be_emit_cstring(":\n"); be_emit_cstring(":\n");
be_emit_write_line(); be_emit_write_line();
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include "../besched.h" #include "../besched.h"
#include "../benode.h" #include "../benode.h"
#include "../begnuas.h"
#include "ppc32_emitter.h" #include "ppc32_emitter.h"
#include "gen_ppc32_emitter.h" #include "gen_ppc32_emitter.h"
...@@ -233,17 +234,6 @@ void ppc32_emit_offset(const ir_node *n) ...@@ -233,17 +234,6 @@ void ppc32_emit_offset(const ir_node *n)
} }
} }
/**
* Returns the target label for a control flow node.
*/
static char *get_cfop_target(const ir_node *irn, char *buf)
{
ir_node *bl = get_irn_link(irn);
snprintf(buf, SNPRINTF_BUF_LEN, "BLOCK_%ld", get_irn_node_nr(bl));
return buf;
}
/** /**
* Emits code for a unconditional jump. * Emits code for a unconditional jump.
*/ */
...@@ -252,7 +242,9 @@ static void emit_Jmp(const ir_node *irn) ...@@ -252,7 +242,9 @@ static void emit_Jmp(const ir_node *irn)
ir_node *block = get_nodes_block(irn); ir_node *block = get_nodes_block(irn);
if (get_irn_link(irn) != get_irn_link(block)) { if (get_irn_link(irn) != get_irn_link(block)) {
be_emit_irprintf("\tb %s", get_cfop_target(irn, printbuf)); ir_node *dest = get_irn_link(irn);
be_emit_cstring("\tb ");
be_gas_emit_block_name(dest);
} else { } else {
be_emit_irprintf("/* fallthrough(%+F) */", get_irn_link(irn)); be_emit_irprintf("/* fallthrough(%+F) */", get_irn_link(irn));
} }
...@@ -297,11 +289,10 @@ static void emit_ppc32_Branch(const ir_node *irn) ...@@ -297,11 +289,10 @@ static void emit_ppc32_Branch(const ir_node *irn)
assert(opind>=0 && opind<8); assert(opind>=0 && opind<8);
if (opind){ if (opind){
get_cfop_target(proj, printbuf);
be_emit_irprintf("\t%8s", branchops[opind]); be_emit_irprintf("\t%8s", branchops[opind]);
ppc32_emit_source_register(irn, 0); ppc32_emit_source_register(irn, 0);
be_emit_cstring(", "); be_emit_cstring(", ");
be_emit_string(printbuf); be_gas_emit_block_name(get_irn_link(proj));
be_emit_finish_line_gas(irn); be_emit_finish_line_gas(irn);
} }
...@@ -309,7 +300,7 @@ static void emit_ppc32_Branch(const ir_node *irn) ...@@ -309,7 +300,7 @@ static void emit_ppc32_Branch(const ir_node *irn)
if (edge) { if (edge) {
ir_node *blk = get_edge_src_irn(edge); ir_node *blk = get_edge_src_irn(edge);
be_emit_cstring("\tb "); be_emit_cstring("\tb ");
be_emit_string(get_cfop_target(blk, printbuf)); be_gas_emit_block_name(get_irn_link(blk));
be_emit_finish_line_gas(irn); be_emit_finish_line_gas(irn);
} }
} }
...@@ -386,13 +377,15 @@ static void emit_ppc32_Switch(const ir_node *irn) ...@@ -386,13 +377,15 @@ static void emit_ppc32_Switch(const ir_node *irn)
be_emit_cstring("\tbeq "); be_emit_cstring("\tbeq ");
ppc32_emit_source_register(irn, 2); ppc32_emit_source_register(irn, 2);
be_emit_irprintf(", %s", get_cfop_target(proj, printbuf)); be_emit_cstring(", ");
be_gas_emit_block_name(get_irn_link(proj));
be_emit_cstring("/* Branch if equal */\n"); be_emit_cstring("/* Branch if equal */\n");
be_emit_write_line(); be_emit_write_line();
} }
} }
assert(defproj != NULL && "didn't find defProj at Switch"); assert(defproj != NULL && "didn't find defProj at Switch");
be_emit_irprintf("\tb %s", get_cfop_target(defproj, printbuf)); be_emit_cstring("\tb ");
be_gas_emit_block_name(get_irn_link(defproj));
be_emit_finish_line_gas(irn); be_emit_finish_line_gas(irn);
} }