# HG changeset patch # User Shinji KONO # Date 1396916263 -32400 # Node ID c073495301ae217d471707f05ec20794d0a509cc # Parent 66f32d0af4d21c664a51b5e4b03b305576348ab9 ia32 apple Mavericks stype global table diff -r 66f32d0af4d2 -r c073495301ae mc-code-ia32.c --- 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"); diff -r 66f32d0af4d2 -r c073495301ae mc-parse.c --- 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 diff -r 66f32d0af4d2 -r c073495301ae test/code-gen-all.c --- 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; }