From f0be238a6a7a2801edfb842a637b19bf91b245bd Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 21 Feb 2014 04:12:35 +0200 Subject: [PATCH] partial ARM support --- tools/cvt_data.c | 34 +++++++++++++++++++++++++++++----- winelib.mak | 30 ++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 winelib.mak diff --git a/tools/cvt_data.c b/tools/cvt_data.c index 9fb6eb9..044857b 100644 --- a/tools/cvt_data.c +++ b/tools/cvt_data.c @@ -19,6 +19,7 @@ static const struct parsed_proto *g_func_sym_pp; static char g_comment[256]; static int g_warn_cnt; static int g_cconv_novalidate; +static int g_arm_mode; // note: must be in ascending order enum dx_type { @@ -323,6 +324,18 @@ static void output_decorated_pp(FILE *fout, fprintf(fout, "@%d", pp->argc * 4); } +static int align_value(int src_val) +{ + if (src_val <= 0) { + awarn("bad align: %d\n", src_val); + src_val = 1; + } + if (!g_arm_mode) + return src_val; + + return __builtin_ffs(src_val) - 1; +} + static int cmpstringp(const void *p1, const void *p2) { return strcmp(*(char * const *)p1, *(char * const *)p2); @@ -366,6 +379,7 @@ int main(int argc, char *argv[]) FILE *fout, *fasm, *fhdr, *frlist; const struct parsed_proto *pp; int no_decorations = 0; + char comment_char = '#'; char words[20][256]; char word[256]; char line[256]; @@ -393,7 +407,7 @@ int main(int argc, char *argv[]) if (argc < 4) { // -nd: no symbol decorations - printf("usage:\n%s [-nd] [-i] <.s> <.asm> [rlist]*\n", + printf("usage:\n%s [-nd] [-i] [-a] <.s> <.asm> [rlist]*\n", argv[0]); return 1; } @@ -403,6 +417,10 @@ int main(int argc, char *argv[]) no_decorations = 1; else if (IS(argv[arg], "-i")) g_cconv_novalidate = 1; + else if (IS(argv[arg], "-a")) { + comment_char = '@'; + g_arm_mode = 1; + } else break; } @@ -475,7 +493,7 @@ int main(int argc, char *argv[]) else aerr("unhandled section: '%s'\n", line); - fprintf(fout, ".align 4\n"); + fprintf(fout, ".align %d\n", align_value(4)); while (fgets(line, sizeof(line), fasm)) { @@ -516,7 +534,7 @@ int main(int argc, char *argv[]) if (IS(words[0], "align")) { val = parse_number(words[1]); - fprintf(fout, "\t\t .align %ld", val); + fprintf(fout, "\t\t .align %d", align_value(val)); goto fin; } @@ -653,7 +671,13 @@ int main(int argc, char *argv[]) if (w != wordc - 1) aerr("TODO\n"); - fprintf(fout, "%s %s", type_name_float(type), words[w]); + if (g_arm_mode && type == DXT_TEN) { + fprintf(fout, ".fill 10"); + snprintf(g_comment, sizeof(g_comment), "%s %s", + type_name_float(type), words[w]); + } + else + fprintf(fout, "%s %s", type_name_float(type), words[w]); goto fin; } @@ -719,7 +743,7 @@ int main(int argc, char *argv[]) fin: if (g_comment[0] != 0) { - fprintf(fout, "\t\t# %s", g_comment); + fprintf(fout, "\t\t%c %s", comment_char, g_comment); g_comment[0] = 0; } fprintf(fout, "\n"); diff --git a/winelib.mak b/winelib.mak new file mode 100644 index 0000000..cda9fd9 --- /dev/null +++ b/winelib.mak @@ -0,0 +1,30 @@ +# CROSS_COMPILE ?= +CC = winegcc +RC = wrc + +CFLAGS += -Wall -ggdb -fno-strict-aliasing -mno-cygwin +ifndef DEBUG +CFLAGS += -O2 +endif +LDFLAGS += -ggdb + +ifdef ARM +WGCC_FLAGS += -marm -b$(patsubst %-,%,$(CROSS_COMPILE)) +# WGCC_FLAGS += --sysroot $(HOME)/stuff/wine_arm/wine-arm-build/ +CFLAGS += $(WGCC_FLAGS) +CFLAGS += -mcpu=cortex-a8 -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon +CFLAGS += -Wno-unused +LDFLAGS += $(WGCC_FLAGS) +# should not be needed, but.. +CFLAGS += -isystem$(HOME)/stuff/wine_arm/inst/include/wine/msvcrt +CFLAGS += -isystem$(HOME)/stuff/wine_arm/inst/include/wine/windows +LDFLAGS += -L$(HOME)/stuff/wine_arm/inst/lib/wine +CVT_OPT = -a +BUILTIN = 1 +else +CFLAGS += -Wno-unused-but-set-variable +CFLAGS += -m32 +LDFLAGS += -m32 +endif + + -- 2.39.5