/*
- * Copyright (C) 1995-2011 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.
+ * Copyright (C) 2012 University of Karlsruhe.
*/
/**
#include "execfreq.h"
#include "be_t.h"
+#include "bearch.h"
#include "beemitter.h"
#include "bedwarf.h"
case GAS_SECTION_DEBUG_FRAME: name = "section __DWARF,__debug_frame,regular,debug"; break;
default: panic("unsupported scetion type 0x%X", section);
}
- be_emit_irprintf("\t.%s\n", name);
- be_emit_write_line();
} else if (flags & GAS_SECTION_FLAG_COMDAT) {
switch (base) {
case GAS_SECTION_TEXT: name = "section __TEXT,__textcoal_nt,coalesced,pure_instructions"; break;
} else {
panic("unsupported section type 0x%X", section);
}
+ be_emit_irprintf("\t.%s\n", name);
+ be_emit_write_line();
}
static void emit_section_sparc(be_gas_section_t section, const ir_entity *entity)
be_emit_char('\n');
be_emit_write_line();
+
+ next_block_nr += 199;
+ next_block_nr -= next_block_nr % 100;
}
/**
init = skip_Id(init);
switch (get_irn_opcode(init)) {
- case iro_Cast:
- emit_init_expression(env, get_Cast_op(init));
- return;
-
case iro_Conv:
emit_init_expression(env, get_Conv_op(init));
return;
return;
default:
- panic("emit_atomic_init(): unsupported IR-node %+F", init);
+ panic("unsupported IR-node %+F", init);
}
}
}
}
-static size_t emit_string_initializer(const ir_initializer_t *initializer)
+static void emit_string_char(int c)
{
- size_t i, len;
-
- len = initializer->compound.n_initializers;
- if (be_gas_object_file_format == OBJECT_FILE_FORMAT_MACH_O) {
- be_emit_cstring("\t.ascii \"");
- } else {
- be_emit_cstring("\t.string \"");
- len -= 1;
+ switch (c) {
+ case '"' : be_emit_cstring("\\\""); break;
+ case '\n': be_emit_cstring("\\n"); break;
+ case '\r': be_emit_cstring("\\r"); break;
+ case '\t': be_emit_cstring("\\t"); break;
+ case '\\': be_emit_cstring("\\\\"); break;
+ default :
+ if (isprint(c))
+ be_emit_char(c);
+ else
+ be_emit_irprintf("\\%03o", c);
+ break;
}
+}
- for (i = 0; i < len; ++i) {
+static size_t emit_string_initializer(const ir_initializer_t *initializer)
+{
+ be_emit_cstring("\t.asciz \"");
+
+ size_t len = initializer->compound.n_initializers;
+ for (size_t i = 0; i < len-1; ++i) {
const ir_initializer_t *sub_initializer
= get_initializer_compound_value(initializer, i);
ir_tarval *tv = get_initializer_tarval(sub_initializer);
int c = get_tarval_long(tv);
-
- switch (c) {
- case '"' : be_emit_cstring("\\\""); break;
- case '\n': be_emit_cstring("\\n"); break;
- case '\r': be_emit_cstring("\\r"); break;
- case '\t': be_emit_cstring("\\t"); break;
- case '\\': be_emit_cstring("\\\\"); break;
- default :
- if (isprint(c))
- be_emit_char(c);
- else
- be_emit_irprintf("\\%03o", c);
- break;
- }
+ emit_string_char(c);
}
be_emit_cstring("\"\n");
be_emit_write_line();
return initializer->compound.n_initializers;
}
+void be_gas_emit_cstring(const char *string)
+{
+ be_emit_cstring("\t.asciz \"");
+ for (const char *c = string; *c != '\0'; ++c) {
+ emit_string_char(*c);
+ }
+ be_emit_cstring("\"\n");
+ be_emit_write_line();
+}
+
typedef enum normal_or_bitfield_kind {
NORMAL = 0,
TARVAL,
const ir_initializer_t *initializer,
ir_type *type)
{
- assert((size_t) (vals - glob_vals) < max_vals);
+ assert((size_t) (vals - glob_vals) <= max_vals);
if (initializer_is_string_const(initializer)) {
assert(vals->kind != BITFIELD);
if (entity != NULL) {
be_gas_emit_entity(entity);
} else {
- void *nr_val = pmap_get(block_numbers, block);
+ void *nr_val = pmap_get(void, block_numbers, block);
int nr;
if (nr_val == NULL) {
nr = next_block_nr++;
}
if (be_options.verbose_asm) {
- int arity;
- ir_graph *irg = get_irn_irg(block);
- ir_exec_freq *exec_freq = be_get_irg_exec_freq(irg);
-
be_emit_pad_comment();
- be_emit_cstring("/* preds:");
+ be_emit_irprintf("/* %+F preds:", block);
- arity = get_irn_arity(block);
+ int arity = get_irn_arity(block);
if (arity == 0) {
be_emit_cstring(" none");
} else {
be_gas_emit_block_name(predblock);
}
}
- if (exec_freq != NULL) {
- be_emit_irprintf(", freq: %.3f",
- get_block_execfreq(exec_freq, block));
- }
- be_emit_cstring(" */");
+ be_emit_irprintf(", freq: %.3f */", get_block_execfreq(block));
}
be_emit_char('\n');
be_emit_write_line();
void be_emit_jump_table(const ir_node *node, const ir_switch_table *table,
ir_entity *entity, get_cfop_target_func get_cfop_target)
{
- unsigned n_outs = arch_get_irn_n_outs(node);
- const ir_node **targets = XMALLOCNZ(const ir_node*, n_outs);
- size_t n_entries = ir_switch_table_get_n_entries(table);
- unsigned long length = 0;
- size_t e;
- const ir_edge_t *edge;
- unsigned i;
- const ir_node **labels;
+ unsigned n_outs = arch_get_irn_n_outs(node);
+ const ir_node **targets = XMALLOCNZ(const ir_node*, n_outs);
+ size_t n_entries = ir_switch_table_get_n_entries(table);
+ unsigned long length = 0;
+ size_t e;
+ unsigned i;
+ const ir_node **labels;
/* go over all proj's and collect their jump targets */
foreach_out_edge(node, edge) {