Merge pull request #1652 from debuglevel/bugfix-crosscompile
[mono.git] / mono / mini / image-writer.c
index a5d7488da85df18fb35a763a4bb6a2e3db902080..599c9ef57293119d4eafc0ef5c4a11d68c98ed9b 100644 (file)
 
 #if (defined(TARGET_AMD64) || defined(TARGET_POWERPC64)) && !defined(__mono_ilp32__)
 #define AS_POINTER_DIRECTIVE ".quad"
+#elif defined(TARGET_ARM64)
+
+#ifdef TARGET_ASM_APPLE
+#define AS_POINTER_DIRECTIVE ".quad"
+#else
+#define AS_POINTER_DIRECTIVE ".xword"
+#endif
+
 #else
 #define AS_POINTER_DIRECTIVE ".long"
 #endif
 #define USE_ELF_WRITER 1
 #endif
 
-#if defined(TARGET_ARM) && !defined(TARGET_MACH)
+#if defined(TARGET_ARM) && !defined(TARGET_MACH) && !defined(HOST_WIN32)
 #define USE_ELF_WRITER 1
 #endif
 
@@ -1251,7 +1259,6 @@ static int normal_sections [] = { SECT_DATA, SECT_DEBUG_FRAME, SECT_DEBUG_INFO,
 static int
 bin_writer_emit_writeout (MonoImageWriter *acfg)
 {
-       FILE *file;
        ElfHeader header;
        ElfProgHeader progh [4];
        ElfSectHeader secth [SECT_NUM];
@@ -1269,11 +1276,9 @@ bin_writer_emit_writeout (MonoImageWriter *acfg)
        ElfSymbol *symtab;
        ElfDynamic dynamic [14];
        int *hash;
-       int i, num_sections, file_offset, virt_offset, size, num_symtab;
+       int i, num_sections, file_offset, virt_offset, size;
        int num_local_syms;
 
-       file = acfg->fp;
-
        /* Section headers */
        memset (&secth, 0, sizeof (secth));
        memset (&dynamic, 0, sizeof (dynamic));
@@ -1297,7 +1302,6 @@ bin_writer_emit_writeout (MonoImageWriter *acfg)
 
        num_sections = collect_sections (acfg, secth, all_sections, 16);
        hash = build_hash (acfg, num_sections, &dyn_str_table);
-       num_symtab = hash [1]; /* FIXME */
 #if 0
        g_print ("num_sections: %d\n", num_sections);
        g_print ("dynsym: %d, dynstr size: %d\n", hash [1], (int)dyn_str_table.data->len);
@@ -1713,7 +1717,7 @@ asm_writer_emit_section_change (MonoImageWriter *acfg, const char *section_name,
                fprintf (acfg->fp, ".section __DWARF, __%s,regular,debug\n", section_name + 1);
        } else
                fprintf (acfg->fp, "%s\n", section_name);
-#elif defined(TARGET_ARM) || defined(TARGET_POWERPC)
+#elif defined(TARGET_ARM) || defined(TARGET_ARM64) || defined(TARGET_POWERPC)
        /* ARM gas doesn't seem to like subsections of .bss */
        if (!strcmp (section_name, ".text") || !strcmp (section_name, ".data")) {
                fprintf (acfg->fp, "%s %d\n", section_name, subsection_index);
@@ -1835,6 +1839,19 @@ asm_writer_emit_alignment (MonoImageWriter *acfg, int size)
 #endif
 }
 
+#ifndef USE_BIN_WRITER
+static void 
+asm_writer_emit_alignment_fill (MonoImageWriter *acfg, int size, int fill)
+{
+       asm_writer_emit_unset_mode (acfg);
+#if defined(TARGET_ASM_APPLE)
+       fprintf (acfg->fp, "\t.align %d, 0x%0x\n", ilog2 (size), fill);
+#else
+       asm_writer_emit_alignment (acfg, size);
+#endif
+}
+#endif
+
 #ifdef __native_client_codegen__
 static void
 asm_writer_emit_nacl_call_alignment (MonoImageWriter *acfg) {
@@ -2142,6 +2159,19 @@ img_writer_emit_alignment (MonoImageWriter *acfg, int size)
 #endif
 }
 
+void
+img_writer_emit_alignment_fill (MonoImageWriter *acfg, int size, int fill)
+{
+#ifdef USE_BIN_WRITER
+       if (acfg->use_bin_writer)
+               bin_writer_emit_alignment (acfg, size);
+       else
+               asm_writer_emit_alignment (acfg, size);
+#else
+       asm_writer_emit_alignment_fill (acfg, size, fill);
+#endif
+}
+
 #ifdef __native_client_codegen__
 void
 img_writer_emit_nacl_call_alignment (MonoImageWriter *acfg) {