From bc1240abd9f93d0ddd5181f45e26c9f6533fbf20 Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Wed, 30 Sep 2015 11:17:53 +0000 Subject: add program to compute the offsets in areals.s, to workaround llvm assembler restrictions --- macho64/areals_compute_offsets.c | 161 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100755 macho64/areals_compute_offsets.c (limited to 'macho64/areals_compute_offsets.c') diff --git a/macho64/areals_compute_offsets.c b/macho64/areals_compute_offsets.c new file mode 100755 index 0000000..be3f5fc --- /dev/null +++ b/macho64/areals_compute_offsets.c @@ -0,0 +1,161 @@ + +#include + +int main (void) +{ + FILE *f,*o; + int c,offset; + + f=fopen ("areals.s","r"); + o=fopen ("areals_offsets.s","w"); + + for (;;){ + c=getc (f); + if (c!='\t') + goto next_line_1; + c=getc (f); + if (c!='#') + goto next_line_1; + c=getc (f); + if (c!='o') + goto next_line_1; + c=getc (f); + if (c!='f') + goto next_line_1; + c=getc (f); + if (c!='f') + goto next_line_1; + c=getc (f); + if (c!='s') + goto next_line_1; + c=getc (f); + if (c!='e') + goto next_line_1; + c=getc (f); + if (c!='t') + goto next_line_1; + c=getc (f); + if (c!='s') + goto next_line_1; + + c=getc (f); + while (c!='\n') + c=getc (f); + break; + + next_line_1: + while (c!='\n') + c=getc (f); + } + + printf ("found #offsets\n"); + + offset=0; + + for (;;){ + if (c=='\n' || c=='\r'){ + c=getc (f); + continue; + } + if (c=='#') + goto next_line; + if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_'){ + do { + fprintf (o,"%c",c); + c=getc (f); + } while ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_'); + fprintf (o,"_offset = %d\n",offset); + if (c==':') + goto next_line; + printf (": expected, not %c\n",c); + return 0; + } + if (c==EOF) + break; + if (!(c==' ' || c=='\t')){ + printf ("line should start with a tab, space or #, not %c\n",c); + return 0; + } + + c=getc (f); + if (c!='.'){ + printf (". expected, not %c\n",c); + return 0; + } + + c=getc (f); + if (c=='d'){ + c=getc (f); + if (c!='o'){ + printf ("o. expected, not %c\n",c); + return 0; + } + c=getc (f); + if (c!='u'){ + printf ("u. expected, not %c\n",c); + return 0; + } + c=getc (f); + if (c!='b'){ + printf ("b. expected, not %c\n",c); + return 0; + } + c=getc (f); + if (c!='l'){ + printf ("l. expected, not %c\n",c); + return 0; + } + c=getc (f); + if (c!='e'){ + printf ("e. expected, not %c\n",c); + return 0; + } + + if (offset & 7){ + printf (".double not 8 byte aligned\n"); + return 0; + } + offset+=8; + + c=getc (f); + goto next_line; + } + if (c=='q'){ + c=getc (f); + if (c!='u'){ + printf ("u. expected, not %c\n",c); + return 0; + } + c=getc (f); + if (c!='a'){ + printf ("a. expected, not %c\n",c); + return 0; + } + c=getc (f); + if (c!='d'){ + printf ("d. expected, not %c\n",c); + return 0; + } + offset+=4; + + c=getc (f); + goto next_line; + } + + printf (".double or .quad expected, not .%c\n",c); + return 0; + + next_line: + while (c!='\n' && c!='\r' && c!=EOF) + c=getc (f); + if (c==EOF) + break; + } + + fclose (o); + fclose (f); + + printf ("all offsets written\n"); + + return 1; +} -- cgit v1.2.3