提交 b8496fdb 编写于 作者: M massimiliano 提交者: Massi

Make the compiler emit code compatible with the xbox assembler for the dynamic link case.

git-svn-id: svn://svn.hq.unity3d.com/home/svn/unity-extra/Mono/consoles@33422 16e7374d-a1f6-0310-9a7a-f1d2bd8b5927
上级 a8f024e1
......@@ -462,7 +462,7 @@ encode_sleb128 (gint32 value, guint8 *buf, guint8 **endbuf)
/* ARCHITECTURE SPECIFIC CODE */
#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_ARM) || defined(TARGET_POWERPC)
#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_ARM) || (defined(TARGET_POWERPC) && ! defined(MONO_AOT_EMIT_XBOX_ASM))
#define EMIT_DWARF_INFO 1
#endif
......@@ -593,9 +593,14 @@ arch_emit_got_offset (MonoAotCompile *acfg, guint8 *code, int *code_size)
* unsupported relocations. So we store the got address into the .Lgot_addr
* symbol which is in the text segment, compute its address, and load it.
*/
fprintf (acfg->fp, ".L%d:\n", acfg->label_generator);
fprintf (acfg->fp, "lis 0, (.Lgot_addr + 4 - .L%d)@h\n", acfg->label_generator);
fprintf (acfg->fp, "ori 0, 0, (.Lgot_addr + 4 - .L%d)@l\n", acfg->label_generator);
fprintf (acfg->fp, "%s%d:\n", LOCAL_LABEL_PREFIX, acfg->label_generator);
#ifdef MONO_AOT_EMIT_XBOX_ASM
fprintf (acfg->fp, "lis 0, (%sgot_addr + 4 - %s%d)\n", LOCAL_LABEL_PREFIX, LOCAL_LABEL_PREFIX, acfg->label_generator);
fprintf (acfg->fp, "addi r0, r0, (%sgot_addr + 4 - %s%d)\n", LOCAL_LABEL_PREFIX, LOCAL_LABEL_PREFIX, acfg->label_generator);
#else
fprintf (acfg->fp, "lis 0, (%sgot_addr + 4 - %s%d)@h\n", LOCAL_LABEL_PREFIX, LOCAL_LABEL_PREFIX, acfg->label_generator);
fprintf (acfg->fp, "ori 0, 0, (%sgot_addr + 4 - %s%d)@l\n", LOCAL_LABEL_PREFIX, LOCAL_LABEL_PREFIX, acfg->label_generator);
#endif
fprintf (acfg->fp, "add 30, 30, 0\n");
fprintf (acfg->fp, "%s 30, 0(30)\n", PPC_LD_OP);
acfg->label_generator ++;
......@@ -740,8 +745,13 @@ arch_emit_plt_entry (MonoAotCompile *acfg, int index)
/* The GOT address is guaranteed to be in r30 by OP_LOAD_GOTADDR */
g_assert (!acfg->use_bin_writer);
img_writer_emit_unset_mode (acfg->w);
#ifdef MONO_AOT_EMIT_XBOX_ASM
fprintf (acfg->fp, "lis 11, %d\n", offset);
fprintf (acfg->fp, "addi r11, r11, %d\n", offset);
#else
fprintf (acfg->fp, "lis 11, %d@h\n", offset);
fprintf (acfg->fp, "ori 11, 11, %d@l\n", offset);
#endif
fprintf (acfg->fp, "add 11, 11, 30\n");
fprintf (acfg->fp, "%s 11, 0(11)\n", PPC_LD_OP);
#ifdef PPC_USES_FUNCTION_DESCRIPTOR
......@@ -832,8 +842,13 @@ arch_emit_specific_trampoline (MonoAotCompile *acfg, int offset, int *tramp_size
/* Load mscorlib got address */
fprintf (acfg->fp, "%s 0, %d(30)\n", PPC_LD_OP, (int)sizeof (gpointer));
/* Load generic trampoline address */
#ifdef MONO_AOT_EMIT_XBOX_ASM
fprintf (acfg->fp, "lis 11, %d\n", (int)(offset * sizeof (gpointer)));
fprintf (acfg->fp, "addi r11, r11, %d\n", (int)(offset * sizeof (gpointer)));
#else
fprintf (acfg->fp, "lis 11, %d@h\n", (int)(offset * sizeof (gpointer)));
fprintf (acfg->fp, "ori 11, 11, %d@l\n", (int)(offset * sizeof (gpointer)));
#endif
fprintf (acfg->fp, "%s 11, 11, 0\n", PPC_LDX_OP);
#ifdef PPC_USES_FUNCTION_DESCRIPTOR
fprintf (acfg->fp, "%s 11, 0(11)\n", PPC_LD_OP);
......@@ -841,8 +856,13 @@ arch_emit_specific_trampoline (MonoAotCompile *acfg, int offset, int *tramp_size
fprintf (acfg->fp, "mtctr 11\n");
/* Load trampoline argument */
/* On ppc, we pass it normally to the generic trampoline */
#ifdef MONO_AOT_EMIT_XBOX_ASM
fprintf (acfg->fp, "lis 11, %d\n", (int)((offset + 1) * sizeof (gpointer)));
fprintf (acfg->fp, "addi r11, r11, %d\n", (int)((offset + 1) * sizeof (gpointer)));
#else
fprintf (acfg->fp, "lis 11, %d@h\n", (int)((offset + 1) * sizeof (gpointer)));
fprintf (acfg->fp, "ori 11, 11, %d@l\n", (int)((offset + 1) * sizeof (gpointer)));
#endif
fprintf (acfg->fp, "%s 0, 11, 0\n", PPC_LDX_OP);
/* Branch to generic trampoline */
fprintf (acfg->fp, "bctr\n");
......@@ -1027,12 +1047,22 @@ arch_emit_static_rgctx_trampoline (MonoAotCompile *acfg, int offset, int *tramp_
/* Load mscorlib got address */
fprintf (acfg->fp, "%s 0, %d(30)\n", PPC_LD_OP, (int)sizeof (gpointer));
/* Load rgctx */
#ifdef MONO_AOT_EMIT_XBOX_ASM
fprintf (acfg->fp, "lis 11, %d\n", (int)(offset * sizeof (gpointer)));
fprintf (acfg->fp, "addi r11, r11, %d\n", (int)(offset * sizeof (gpointer)));
#else
fprintf (acfg->fp, "lis 11, %d@h\n", (int)(offset * sizeof (gpointer)));
fprintf (acfg->fp, "ori 11, 11, %d@l\n", (int)(offset * sizeof (gpointer)));
#endif
fprintf (acfg->fp, "%s %d, 11, 0\n", PPC_LDX_OP, MONO_ARCH_RGCTX_REG);
/* Load target address */
#ifdef MONO_AOT_EMIT_XBOX_ASM
fprintf (acfg->fp, "lis 11, %d\n", (int)((offset + 1) * sizeof (gpointer)));
fprintf (acfg->fp, "addi r11, r11, %d\n", (int)((offset + 1) * sizeof (gpointer)));
#else
fprintf (acfg->fp, "lis 11, %d@h\n", (int)((offset + 1) * sizeof (gpointer)));
fprintf (acfg->fp, "ori 11, 11, %d@l\n", (int)((offset + 1) * sizeof (gpointer)));
#endif
fprintf (acfg->fp, "%s 11, 11, 0\n", PPC_LDX_OP);
#ifdef PPC_USES_FUNCTION_DESCRIPTOR
fprintf (acfg->fp, "%s 2, %d(11)\n", PPC_LD_OP, (int)sizeof (gpointer));
......@@ -1355,16 +1385,21 @@ arch_emit_autoreg (MonoAotCompile *acfg, char *symbol)
"std 31,120(1)\n"
"std 0,144(1)\n"
".Lautoreg:\n"
"lis 3, .Lglobals@h\n"
"ori 3, 3, .Lglobals@l\n"
"%sautoreg:\n"
#ifdef MONO_AOT_EMIT_XBOX_ASM
"lis 3, %sglobals\n"
"addi r3, r3, %sglobals\n"
#else
"lis 3, %sglobals@h\n"
"ori 3, 3, %sglobals@l\n"
#endif
"bl .mono_aot_register_module\n"
"ld 11,0(1)\n"
"ld 0,16(11)\n"
"mtlr 0\n"
"ld 31,-8(11)\n"
"mr 1,11\n"
"blr\n"
"blr\n", LOCAL_LABEL_PREFIX, LOCAL_LABEL_PREFIX, LOCAL_LABEL_PREFIX
);
#if defined(_MSC_VER) || defined(MONO_CROSS_COMPILE)
fprintf (acfg->fp,
......@@ -3789,7 +3824,7 @@ emit_plt (MonoAotCompile *acfg)
*/
if (ji && is_direct_callable (acfg, NULL, ji) && !acfg->use_bin_writer) {
MonoCompile *callee_cfg = g_hash_table_lookup (acfg->method_to_cfg, ji->data.method);
fprintf (acfg->fp, "\n.set %s, %s\n", label, callee_cfg->asm_symbol);
fprintf (acfg->fp, "\n.set %s, %sm_%x\n", label, LOCAL_LABEL_PREFIX, get_method_index (acfg, callee_cfg->orig_method));
continue;
}
}
......@@ -4725,7 +4760,7 @@ mono_aot_get_plt_symbol (MonoJumpInfoType type, gconstpointer data)
plt_entry = get_plt_entry (llvm_acfg, ji);
return g_strdup_printf (plt_entry->symbol);
return g_strdup_printf ("%sp_%d", LOCAL_LABEL_PREFIX, offset);
}
MonoJumpInfo*
......@@ -4842,7 +4877,7 @@ emit_code (MonoAotCompile *acfg)
GList *l;
#if defined(TARGET_POWERPC64)
sprintf (symbol, ".Lgot_addr");
sprintf (symbol, "%sgot_addr", LOCAL_LABEL_PREFIX);
emit_section_change (acfg, ".text", 0);
emit_alignment (acfg, 8);
emit_label (acfg, symbol);
......@@ -5688,7 +5723,7 @@ emit_globals_table (MonoAotCompile *acfg)
}
/* Emit the table */
sprintf (symbol, ".Lglobals_hash");
sprintf (symbol, "%sglobals_hash", LOCAL_LABEL_PREFIX);
emit_section_change (acfg, RODATA_SECT, 0);
emit_alignment (acfg, 8);
emit_label (acfg, symbol);
......@@ -5722,7 +5757,7 @@ emit_globals_table (MonoAotCompile *acfg)
}
/* Emit the globals table */
sprintf (symbol, ".Lglobals");
sprintf (symbol, "%sglobals", LOCAL_LABEL_PREFIX);
emit_section_change (acfg, ".data", 0);
/* This is not a global, since it is accessed by the init function */
emit_alignment (acfg, 8);
......
......@@ -69,17 +69,29 @@
#define AS_STRING_DIRECTIVE ".string"
#endif
#if defined (MONO_AOT_EMIT_XBOX_ASM)
#define AS_INT32_DIRECTIVE "DD"
#define AS_INT64_DIRECTIVE "DQ"
#else
#define AS_INT32_DIRECTIVE ".long"
#define AS_INT64_DIRECTIVE ".quad"
#endif
#if (defined(TARGET_AMD64) || defined(TARGET_POWERPC64)) && !defined(__mono_ilp32__)
#define AS_POINTER_DIRECTIVE ".quad"
#else
#ifdef MONO_AOT_EMIT_XBOX_ASM
#define AS_POINTER_DIRECTIVE "DD"
#else
#define AS_POINTER_DIRECTIVE ".long"
#endif
#endif
#if defined(TARGET_ASM_APPLE)
#define AS_INT16_DIRECTIVE ".short"
#elif defined(MONO_AOT_EMIT_XBOX_ASM)
#define AS_INT16_DIRECTIVE "DW"
#elif defined(TARGET_ASM_GAS)
#define AS_INT16_DIRECTIVE ".hword"
#else
......@@ -171,6 +183,9 @@ struct _MonoImageWriter {
int mode; /* emit mode */
int col_count; /* bytes emitted per .byte line */
int label_gen;
#ifdef MONO_AOT_EMIT_XBOX_ASM
char current_section_name [256];
#endif
};
static G_GNUC_UNUSED int
......@@ -1495,11 +1510,22 @@ asm_writer_emit_start (MonoImageWriter *acfg)
#endif
}
static void
asm_writer_emit_line (MonoImageWriter *acfg);
static int
asm_writer_emit_writeout (MonoImageWriter *acfg)
{
#if defined(TARGET_ARM) && defined(__APPLE__)
fprintf (acfg->fp, "#endif\n");
#endif
#ifdef MONO_AOT_EMIT_XBOX_ASM
asm_writer_emit_line (acfg);
if (acfg->current_section_name [0] != 0) {
fprintf (acfg->fp, "_%s\tENDS\n", &(acfg->current_section_name [0]));
acfg->current_section_name [0] = 0;
}
fprintf (acfg->fp, "END\n");
#endif
fclose (acfg->fp);
......@@ -1518,6 +1544,21 @@ asm_writer_emit_unset_mode (MonoImageWriter *acfg)
static void
asm_writer_emit_section_change (MonoImageWriter *acfg, const char *section_name, int subsection_index)
{
#ifdef MONO_AOT_EMIT_XBOX_ASM
asm_writer_emit_line (acfg);
if (acfg->current_section_name [0] != 0) {
fprintf (acfg->fp, "_%s\tENDS\n", &(acfg->current_section_name [0]));
}
strcpy (&(acfg->current_section_name [0]), section_name);
if (acfg->current_section_name [0] == '.') {
int i;
for (i = 1; acfg->current_section_name [i] != 0; i++) {
acfg->current_section_name [i - 1] = acfg->current_section_name [i];
}
acfg->current_section_name [i - 1] = '\0';
}
fprintf (acfg->fp, "_%s\tSEGMENT PARA '%s'\n", &(acfg->current_section_name [0]), &(acfg->current_section_name [0]));
#else
asm_writer_emit_unset_mode (acfg);
#if defined(TARGET_ASM_APPLE)
if (strcmp(section_name, ".bss") == 0)
......@@ -1545,6 +1586,7 @@ asm_writer_emit_section_change (MonoImageWriter *acfg, const char *section_name,
fprintf (acfg->fp, ".subsection %d\n", subsection_index);
}
#endif
#endif
}
static inline
......@@ -1569,7 +1611,7 @@ asm_writer_emit_symbol_type (MonoImageWriter *acfg, const char *name, gboolean f
stype = "object";
asm_writer_emit_unset_mode (acfg);
#if defined(TARGET_ASM_APPLE)
#if defined(TARGET_ASM_APPLE) || defined (MONO_AOT_EMIT_XBOX_ASM)
#elif defined(TARGET_ARM)
fprintf (acfg->fp, "\t.type %s,#%s\n", name, stype);
......@@ -1585,8 +1627,12 @@ asm_writer_emit_global (MonoImageWriter *acfg, const char *name, gboolean func)
#if (defined(__ppc__) && defined(TARGET_ASM_APPLE)) || (defined(HOST_WIN32) && !defined(MONO_CROSS_COMPILE))
// mach-o always uses a '_' prefix.
fprintf (acfg->fp, "\t.globl _%s\n", name);
#else
#ifdef MONO_AOT_EMIT_XBOX_ASM
fprintf (acfg->fp, "\tPUBLIC %s\n", name);
#else
fprintf (acfg->fp, "\t.globl %s\n", name);
#endif
#endif
asm_writer_emit_symbol_type (acfg, name, func);
......@@ -1597,7 +1643,7 @@ asm_writer_emit_local_symbol (MonoImageWriter *acfg, const char *name, const cha
{
asm_writer_emit_unset_mode (acfg);
#ifndef TARGET_ASM_APPLE
#if ! (defined (TARGET_ASM_APPLE) || (defined (MONO_AOT_EMIT_XBOX_ASM)))
fprintf (acfg->fp, "\t.local %s\n", name);
#endif
......@@ -1609,7 +1655,7 @@ asm_writer_emit_symbol_size (MonoImageWriter *acfg, const char *name, const char
{
asm_writer_emit_unset_mode (acfg);
#ifndef TARGET_ASM_APPLE
#if ! (defined(TARGET_ASM_APPLE) || defined(MONO_AOT_EMIT_XBOX_ASM))
fprintf (acfg->fp, "\t.size %s,%s-%s\n", name, end_label, name);
#endif
}
......@@ -1634,7 +1680,15 @@ static void
asm_writer_emit_string (MonoImageWriter *acfg, const char *value)
{
asm_writer_emit_unset_mode (acfg);
#if defined (MONO_AOT_EMIT_XBOX_ASM)
if (*value != '\0') {
fprintf (acfg->fp, "\tDB \"%s\",0\n", value);
} else {
fprintf (acfg->fp, "\tDB 0\n");
}
#else
fprintf (acfg->fp, "\t%s \"%s\"\n", AS_STRING_DIRECTIVE, value);
#endif
}
static void
......@@ -1648,7 +1702,9 @@ static void
asm_writer_emit_alignment (MonoImageWriter *acfg, int size)
{
asm_writer_emit_unset_mode (acfg);
#if defined(TARGET_ARM)
#if defined(MONO_AOT_EMIT_XBOX_ASM)
fprintf (acfg->fp, "\tALIGN %d\n", size);
#elif defined(TARGET_ARM)
fprintf (acfg->fp, "\t.align %d\n", ilog2 (size));
#elif defined(__ppc__) && defined(TARGET_ASM_APPLE)
// the mach-o assembler specifies alignments as powers of 2.
......@@ -1711,7 +1767,11 @@ asm_writer_emit_bytes (MonoImageWriter *acfg, const guint8* buf, int size)
for (i = 0; i < size; ++i, ++acfg->col_count) {
if ((acfg->col_count % 32) == 0)
#if defined(MONO_AOT_EMIT_XBOX_ASM)
fprintf (acfg->fp, "\n\tDB %d", buf [i]);
#else
fprintf (acfg->fp, "\n\t.byte %d", buf [i]);
#endif
else
fputs (byte_to_str + (buf [i] * 8), acfg->fp);
}
......@@ -1794,7 +1854,11 @@ static void
asm_writer_emit_zero_bytes (MonoImageWriter *acfg, int num)
{
asm_writer_emit_unset_mode (acfg);
#if defined(MONO_AOT_EMIT_XBOX_ASM)
fprintf (acfg->fp, "\tDB %d DUP(0)\n", num);
#else
fprintf (acfg->fp, "\t%s %d\n", AS_SKIP_DIRECTIVE, num);
#endif
}
/* EMIT FUNCTIONS */
......@@ -2160,6 +2224,10 @@ img_writer_create (FILE *fp, gboolean use_bin_writer)
w->use_bin_writer = use_bin_writer;
w->mempool = mono_mempool_new ();
#ifdef MONO_AOT_EMIT_XBOX_ASM
w->current_section_name [0] = '\0';
#endif
return w;
}
......@@ -2190,5 +2258,9 @@ img_writer_get_fp (MonoImageWriter *acfg)
const char *
img_writer_get_temp_label_prefix (MonoImageWriter *acfg)
{
return AS_TEMP_LABEL_PREFIX;
#ifdef TARGET_ASM_APPLE
return "L";
#else
return LOCAL_LABEL_PREFIX;
#endif
}
......@@ -12,6 +12,14 @@
#ifndef __MONO_IMAGE_WRITER_H__
#define __MONO_IMAGE_WRITER_H__
#define MONO_AOT_EMIT_XBOX_ASM
#ifdef MONO_AOT_EMIT_XBOX_ASM
#define LOCAL_LABEL_PREFIX "local_"
#else
#define LOCAL_LABEL_PREFIX ".L"
#endif
#include "config.h"
#include <glib.h>
......
......@@ -231,6 +231,7 @@ void mono_nacl_fix_patches(const guint8 *code, MonoJumpInfo *ji)
gboolean
mono_running_on_valgrind (void)
{
#ifdef HAVE_VALGRIND_MEMCHECK_H
if (RUNNING_ON_VALGRIND){
#ifdef VALGRIND_JIT_REGISTER_MAP
valgrind_register = TRUE;
......@@ -238,6 +239,9 @@ mono_running_on_valgrind (void)
return TRUE;
} else
return FALSE;
#else
return FALSE;
#endif
}
typedef struct {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册