summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn van Groningen2015-09-30 11:17:53 +0000
committerJohn van Groningen2015-09-30 11:17:53 +0000
commitbc1240abd9f93d0ddd5181f45e26c9f6533fbf20 (patch)
tree2cda5c3f3c3ba78ac1033ec15aae4c9d71254a3b
parentmove 16 byte aligned quad pairs to the beginning of the data section, add #of... (diff)
add program to compute the offsets in areals.s, to workaround llvm assembler restrictions
-rwxr-xr-xmacho64/areals_compute_offsets.c161
1 files changed, 161 insertions, 0 deletions
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 <stdio.h>
+
+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;
+}