/*
- * 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;
}
}
-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);