changeset 898:c073495301ae

ia32 apple Mavericks stype global table
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Apr 2014 09:17:43 +0900
parents 66f32d0af4d2
children 62498a76e716
files mc-code-ia32.c mc-parse.c test/code-gen-all.c
diffstat 3 files changed, 203 insertions(+), 174 deletions(-) [+]
line wrap: on
line diff
--- a/mc-code-ia32.c	Mon Apr 07 10:27:12 2014 +0900
+++ b/mc-code-ia32.c	Tue Apr 08 09:17:43 2014 +0900
@@ -62,7 +62,7 @@
 #define __FINITE_MATH_ONLY__ 0\n\
 #define __SHRT_MAX__ 32767\n\
 #define __LDBL_MAX__ 1.18973149535723176502e+4932L\n\
-#define __APPLE_CC__ 5367\n\
+#define __APPLE_CC__ 6000\n\
 #define __UINTMAX_TYPE__ long long unsigned int\n\
 #define __SCHAR_MAX__ 127\n\
 #define __USER_LABEL_PREFIX__ _\n\
@@ -1814,8 +1814,12 @@
 code_call(int e2,NMTBL *fn,int jmp)
 {
     if (car(e2) == FNAME) {     
-#ifdef __APPLE__
+#if __APPLE__
+#if (__APPLE_CC__>=6000)
+        printf("\tcall\t_%s\n",fn->nm);
+#else
         printf("\tcall\tL_%s$stub\n",fn->nm);
+#endif
 #else
         printf("\tcall\t%s\n",fn->nm);
 #endif
@@ -2054,7 +2058,11 @@
 void
 code_jmp(char *s) {
 #ifdef __APPLE__
+#if (__APPLE_CC__>=6000)
+        printf("\tjmp\t_%s\n",s);
+#else
     printf("\tjmp\tL_%s$stub\n",s);
+#endif
 #else
     printf("\tjmp %s\n",s);
 #endif
@@ -2511,8 +2519,9 @@
 
     // printf("## args %d disp %d  code_disp_offset=%d\n",args,disp,code_disp_offset); 
 #ifdef __APPLE__
-    printf("\tcall\t___i686.get_pc_thunk.bx\n");
+    printf("\tcall\t_%d\n",labelno);
     printf("_%d:\n",labelno);
+    printf("\tpopl\t%%ebx\n");
     goffset_label = labelno;
     labelno++;
     regs[REG_EBX] = 1;
@@ -2561,8 +2570,9 @@
     printf("\tpushl %%edi\n");
     printf("\tlea -%s%d(%%ebp),%%esp\n",lpfx,r1_offset_label); 
 #ifdef __APPLE__
-    printf("\tcall\t___i686.get_pc_thunk.bx\n");
+    printf("\tcall\t_%d\n",labelno);
     printf("_%d:\n",labelno);
+    printf("\tpopl\t%%ebx\n");
     goffset_label = labelno;
     labelno++;
     regs[REG_EBX] = 1;
@@ -2969,6 +2979,24 @@
             printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
         }
     }
+    for(n = global_list;n!=&null_nptr;n = n->next) {
+        if (n->sc==EXTRN1) {
+            if (!(is_code(n) || is_function(n))) {
+        printf("\t.section __IMPORT,__pointers,non_lazy_symbol_pointers\n");
+        printf("L_%s$non_lazy_ptr:\n\t.indirect_symbol _%s\n\t.long\t0\n",
+                                n->nm,n->nm);
+            }
+#if (! __APPLE_CC__>=6000)
+            printf("\t.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5\n");
+            printf("L_%s$stub:\n",n->nm);
+            printf("\t.indirect_symbol _%s\n",n->nm);
+            printf("\thlt ; hlt ; hlt ; hlt ; hlt\n");
+#endif
+        }
+    }
+#if (! __APPLE_CC__>=6000)
+    // only necessary symbols
+#endif
     init=0;
     for(n = global_list;n!=&null_nptr;n = n->next) {
         if (n->sc == GVAR || 
@@ -2981,26 +3009,8 @@
                                 n->nm,n->nm);
         }
     }
-    for(n = global_list;n!=&null_nptr;n = n->next) {
-        if (n->sc==EXTRN1) {
-            if (!(is_code(n) || is_function(n))) {
-        printf("\t.section __IMPORT,__pointers,non_lazy_symbol_pointers\n");
-        printf("L_%s$non_lazy_ptr:\n\t.indirect_symbol _%s\n\t.long\t0\n",
-                                n->nm,n->nm);
-            }
-            printf("\t.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5\n");
-            printf("L_%s$stub:\n",n->nm);
-            printf("\t.indirect_symbol _%s\n",n->nm);
-            printf("\thlt ; hlt ; hlt ; hlt ; hlt\n");
-        }
-    }
     printf("        .subsections_via_symbols\n");
-    printf("        .section __TEXT,__textcoal_nt,coalesced,pure_instructions\n");
-    printf(".weak_definition        ___i686.get_pc_thunk.bx\n");
-    printf(".private_extern ___i686.get_pc_thunk.bx\n");
-    printf("___i686.get_pc_thunk.bx:\n");
-    printf("        movl    (%%esp), %%ebx\n");
-    printf("        ret\n");
+
 }
 
 #endif
@@ -3906,6 +3916,16 @@
         printf("\tlea 16(%%esp),%%esp\n");
         return;
 #ifdef __APPLE__
+#if (__APPLE_CC__ >= 6000)
+    case LDIV:  call="___divdi3"; 
+         extern_define("__divdi3",0,FUNCTION,1); break;
+    case LUDIV: call="___udivdi3";
+         extern_define("__udivdi3",0,FUNCTION,1); break;
+    case LMOD:  call="___moddi3";
+         extern_define("__moddi3",0,FUNCTION,1); break;
+    case LUMOD: call="___umoddi3";
+         extern_define("__umoddi3",0,FUNCTION,1); break;
+#else
     case LDIV:  call="L___divdi3$stub"; 
          extern_define("__divdi3",0,FUNCTION,1); break;
     case LUDIV: call="L___udivdi3$stub";
@@ -3914,6 +3934,7 @@
          extern_define("__moddi3",0,FUNCTION,1); break;
     case LUMOD: call="L___umoddi3$stub";
          extern_define("__umoddi3",0,FUNCTION,1); break;
+#endif
 #else
     case LDIV:  call="__divdi3"; break;
     case LUDIV: call="__udivdi3"; break;
@@ -4167,7 +4188,11 @@
         printf("\tsubl $16,%%esp\n");
         printf("\tfstpl (%%esp)\n");
 #ifdef __APPLE__
+#if (__APPLE_CC__>=6000)
+        printf("\tcall ___fixunsdfdi\n");
+#else
         printf("\tcall L___fixunsdfdi$stub\n");
+#endif
         extern_define("__fixunsdfdi",0,FUNCTION,1); 
 #else
         printf("\tcall __fixunsdfdi\n");
@@ -4189,7 +4214,11 @@
         printf("\tsubl $16,%%esp\n");
         printf("\tfstps (%%esp)\n");
 #ifdef __APPLE__
+#if (__APPLE_CC__>=6000)
+        printf("\tcall ___fixunssfdi\n");
+#else
         printf("\tcall L___fixunssfdi$stub\n");
+#endif
         extern_define("__fixunssfdi",0,FUNCTION,1); 
 #else
         printf("\tcall __fixunssfdi\n");
--- a/mc-parse.c	Mon Apr 07 10:27:12 2014 +0900
+++ b/mc-parse.c	Tue Apr 08 09:17:43 2014 +0900
@@ -51,7 +51,7 @@
 extern double strtod(const char *nptr, char **endptr);
 #endif
 
-int parse_mode = 1; // generate parse tree for all code
+int parse_mode = 0; // generate parse tree for all code
 
 static int HEAP_REPORT = 0;
 static int lfree_type_limit;     // debugging purpose
--- a/test/code-gen-all.c	Mon Apr 07 10:27:12 2014 +0900
+++ b/test/code-gen-all.c	Tue Apr 08 09:17:43 2014 +0900
@@ -7,189 +7,189 @@
 #else
 #define INLINE
 #endif
-        code_endian();
+	code_endian();
 #if 1
 #else
 #endif
-        code_lvar();
-        code_lvar_address();
-        code_label();
-        code_label1();
+	code_lvar();
+	code_lvar_address();
+	code_label();
+	code_label1();
 #if FLOAT_CODE
 #endif
 #if LONGLONG_CODE
 #endif
-        code_gvar();
-        code_register();
-        code_fname();
-        code_neg();
-        code_not();
-        code_lnot();
-        code_preinc();
-        code_upostinc();
-        code_postinc();
-        code_upreinc();
-        code_register_preinc();
-        code_register_upostinc();
-        code_register_postinc();
-        code_register_upreinc();
-        code_return_int();
+	code_gvar();
+	code_register();
+	code_fname();
+	code_neg();
+	code_not();
+	code_lnot();
+	code_preinc();
+	code_upostinc();
+	code_postinc();
+	code_upreinc();
+	code_register_preinc();
+	code_register_upostinc();
+	code_register_postinc();
+	code_register_upreinc();
+	code_return_int();
 #if FLOAT_CODE
-        code_return_float();
+	code_return_float();
 #if LONG_DOUBLE_CODE 
 #endif
-        code_return_double();
+	code_return_double();
 #if LONG_DOUBLE_CODE 
 #endif
 #endif
 #if LONGLONG_CODE
-        code_return_longlong();
+	code_return_longlong();
 #endif
-        code_return_struct1();
-        code_return_struct();
-        code_gt();
-        code_ugt();
-        code_ge();
-        code_uge();
-        code_eq();
-        code_bool();
-        code_bool_const();
-        code_cmp();
-        code_cmp_global();
-        code_cmp_register();
-        code_string();
-        struct_push();
-        code_rindirect();
-        code_crindirect();
-        code_srindirect();
+	code_return_struct1();
+	code_return_struct();
+	code_gt();
+	code_ugt();
+	code_ge();
+	code_uge();
+	code_eq();
+	code_bool();
+	code_bool_const();
+	code_cmp();
+	code_cmp_global();
+	code_cmp_register();
+	code_string();
+	struct_push();
+	code_rindirect();
+	code_crindirect();
+	code_srindirect();
 #if FLOAT_CODE
-        code_drindirect();
+	code_drindirect();
 #if LONG_DOUBLE_CODE 
 #endif
 #if LONG_DOUBLE_CODE 
 #endif
 #endif
 #if LONGLONG_CODE
-        code_lrindirect();
+	code_lrindirect();
 #endif
-        code_assign();
-        code_assign_register();
-        code_register_assop();
-        code_iassop_l();
-        code_iassop_g();
-        code_iassop_g_c();
-        code_assop();
-        code_register_assop_const();
-        code_assop_const();
-        tosop();
-        oprtc();
-        register_tosop();
-        register_oprtc();
+	code_assign();
+	code_assign_register();
+	code_register_assop();
+	code_iassop_l();
+	code_iassop_g();
+	code_iassop_g_c();
+	code_assop();
+	code_register_assop_const();
+	code_assop_const();
+	tosop();
+	oprtc();
+	register_tosop();
+	register_oprtc();
 #if FLOAT_CODE
-        code_cmp_dregister();
-        code_dregister();
-        code_dassign();
-        code_register_dassign();
-        code_dneg();
-        code_d2i();
-        code_i2d();
-        code_d2u();
-        code_u2d();
-        code_f2i();
-        code_i2f();
-        code_f2u();
-        code_u2f();
-        code_dgvar();
-        code_dlvar();
-        code_cmp_d_global();
-        code_cmp_d();
-        dtosop();
-        dtosop_register();
-        code_dassop();
-        code_register_dassop();
-        code_dpreinc();
-        code_dpostinc();
-        code_register_dpreinc();
-        code_register_dpostinc();
-        code_dgt();
-        code_fgt();
-        code_dge();
-        code_fge();
-        code_deq();
-        code_dbool();
+	code_cmp_dregister();
+	code_dregister();
+	code_dassign();
+	code_register_dassign();
+	code_dneg();
+	code_d2i();
+	code_i2d();
+	code_d2u();
+	code_u2d();
+	code_f2i();
+	code_i2f();
+	code_f2u();
+	code_u2f();
+	code_dgvar();
+	code_dlvar();
+	code_cmp_d_global();
+	code_cmp_d();
+	dtosop();
+	dtosop_register();
+	code_dassop();
+	code_register_dassop();
+	code_dpreinc();
+	code_dpostinc();
+	code_register_dpreinc();
+	code_register_dpostinc();
+	code_dgt();
+	code_fgt();
+	code_dge();
+	code_fge();
+	code_deq();
+	code_dbool();
 #endif
 #if LONGLONG_CODE
-        code_lbool();
-        code_lregister();
-        code_cmp_lregister();
-        code_cmp_lrgvar();
-        code_cmp_lrlvar();
-        code_lassign();
-        code_lassign_register();
-        code_lneg();
-        code_lrgvar();
-        code_lrlvar();
-        ltosop();
-        loprtc();
-        ltosop_register();
-        loprtc_register();
-        code_i2ll();
-        code_i2ull();
-        code_u2ll();
-        code_u2ull();
-        code_ll2i();
-        code_ll2u();
-        code_ull2i();
-        code_ull2u();
+	code_lbool();
+	code_lregister();
+	code_cmp_lregister();
+	code_cmp_lrgvar();
+	code_cmp_lrlvar();
+	code_lassign();
+	code_lassign_register();
+	code_lneg();
+	code_lrgvar();
+	code_lrlvar();
+	ltosop();
+	loprtc();
+	ltosop_register();
+	loprtc_register();
+	code_i2ll();
+	code_i2ull();
+	code_u2ll();
+	code_u2ull();
+	code_ll2i();
+	code_ll2u();
+	code_ull2i();
+	code_ull2u();
 #if FLOAT_CODE
-        code_d2ll();
-        code_d2ull();
-        code_f2ll();
-        code_f2ull();
-        code_ll2d();
-        code_ll2f();
-        code_ull2d();
-        code_ull2f();
+	code_d2ll();
+	code_d2ull();
+	code_f2ll();
+	code_f2ull();
+	code_ll2d();
+	code_ll2f();
+	code_ull2d();
+	code_ull2f();
 #endif
-        code_lpreinc();
-        code_lpostinc();
-        code_lupreinc();
-        code_lupostinc();
-        code_register_lpreinc();
-        code_register_lpostinc();
-        code_register_lupreinc();
-        code_register_lupostinc();
-        code_register_lassop();
-        code_lassop();
-        code_register_lassop_const();
-        code_lassop_const();
-        code_lassop_l();
-        code_lassop_g();
-        code_lassop_g_c();
-        code_lgt();
-        code_lugt();
-        code_lge();
-        code_luge();
-        code_leq();
+	code_lpreinc();
+	code_lpostinc();
+	code_lupreinc();
+	code_lupostinc();
+	code_register_lpreinc();
+	code_register_lpostinc();
+	code_register_lupreinc();
+	code_register_lupostinc();
+	code_register_lassop();
+	code_lassop();
+	code_register_lassop_const();
+	code_lassop_const();
+	code_lassop_l();
+	code_lassop_g();
+	code_lassop_g_c();
+	code_lgt();
+	code_lugt();
+	code_lge();
+	code_luge();
+	code_leq();
 #if 0
-        code_lswitch();
+	code_lswitch();
 #endif
 #endif
-        code_switch();
-        code_cond_iii();
-        code_cond_ii0();
-        code_cond_uuu();
-        code_cond_uii();
+	code_switch();
+	code_cond_iii();
+	code_cond_ii0();
+	code_cond_uuu();
+	code_cond_uii();
 #if FLOAT_CODE
-        code_cond_fff();
-        code_cond_ddd();
-        code_cond_float();
-        code_d2f();
-        code_f2d();
+	code_cond_fff();
+	code_cond_ddd();
+	code_cond_float();
+	code_d2f();
+	code_f2d();
 #endif
 #if LONGLONG_CODE 
-        code_cond_lll();
-        code_cond_ulll();
-        code_cond_luu();
+	code_cond_lll();
+	code_cond_ulll();
+	code_cond_luu();
 #endif
 return 0; }