@@ -192,7 +192,6 @@ static char *arith_ins(NodeKind kind);
192192static void imm_tmpl (char * ins , char * op , int64_t val );
193193
194194static bool is_asm_symbolic_arg (Node * node , char * punct );
195- static void mark_live (Obj * var );
196195
197196#define Prints (str ) fprintf(output_file, str)
198197#define Printsts (str ) fprintf(output_file, "\t" str)
@@ -223,11 +222,6 @@ static void insrtln(char *fmt, long loc, ...) {
223222 fseek (output_file , cur_loc , SEEK_SET );
224223}
225224
226- static bool is_valid_vis (char * vis ) {
227- return vis &&
228- (!strcmp (vis , "hidden" ) || !strcmp (vis , "internal" ) || !strcmp (vis , "protected" ));
229- }
230-
231225static void push_ref (Obj * var ) {
232226 HashEntry * ent = hashmap_get_or_insert (ext_refs , var -> name , strlen (var -> name ));
233227 if (ent -> val )
@@ -4851,20 +4845,24 @@ static int assign_lvar_offsets(Scope *sc, int bottom) {
48514845 return max_depth ;
48524846}
48534847
4854- static void emit_symbol (Obj * var , char * name ) {
4848+ static void emit_symbol2 (Obj * var , char * name , char * vis ) {
48554849 if (var -> is_static )
48564850 Printftn (".local \"%s\"" , name );
48574851 else if (var -> is_weak )
48584852 Printftn (".weak \"%s\"" , name );
48594853 else
48604854 Printftn (".globl \"%s\"" , name );
48614855
4856+ if (vis &&
4857+ (!strcmp (vis , "hidden" ) || !strcmp (vis , "internal" ) || !strcmp (vis , "protected" )))
4858+ Printftn (".%s \"%s\"" , vis , name );
4859+
48624860 if (var -> alias_name )
48634861 Printftn (".set \"%s\", \"%s\"" , asm_name (var ), var -> alias_name );
4862+ }
48644863
4865- char * vis = var -> visibility ? var -> visibility : opt_visibility ;
4866- if (is_valid_vis (vis ))
4867- Printftn (".%s \"%s\"" , vis , name );
4864+ static void emit_symbol (Obj * var , char * name ) {
4865+ emit_symbol2 (var , name , var -> visibility ? var -> visibility : opt_visibility );
48684866}
48694867
48704868static bool is_rodata_obj (Obj * var ) {
@@ -5278,29 +5276,29 @@ static void peep_redunt_jmp(char *p) {
52785276 }
52795277}
52805278
5281- static void mark_alias_live (char * name ) {
5282- Obj * alias = get_symbol_var (name );
5283- if (alias )
5284- mark_live (alias );
5285- }
5286-
5287- static void mark_live (Obj * var ) {
5279+ static void mark_live (Obj * var , bool is_ref ) {
52885280 if (var -> is_live )
52895281 return ;
5290- var -> is_live = true;
52915282
52925283 if (!var -> is_definition ) {
5293- if (var -> alias_name )
5294- mark_alias_live (var -> alias_name );
5284+ var -> is_live = is_ref ;
5285+
5286+ if (var -> alias_name ) {
5287+ Obj * alias = get_symbol_var (var -> alias_name );
5288+ if (alias && alias -> is_definition )
5289+ mark_live (alias , true);
5290+ }
52955291 return ;
52965292 }
5293+ var -> is_live = true;
5294+
52975295 if (var -> ty -> kind == TY_FUNC ) {
52985296 for (int i = 0 ; i < var -> output -> ref_cnt ; i ++ )
5299- mark_live (var -> output -> refs [i ]);
5297+ mark_live (var -> output -> refs [i ], true );
53005298 } else {
53015299 for (Relocation * rel = var -> rel ; rel ; rel = rel -> next )
53025300 if (rel -> var )
5303- mark_live (rel -> var );
5301+ mark_live (rel -> var , true );
53045302 }
53055303}
53065304
@@ -5323,31 +5321,23 @@ int codegen(Obj *prog, FILE *out) {
53235321 }
53245322 var -> is_definition = false;
53255323 var -> output = NULL ;
5324+ continue ;
53265325 }
5326+ if (var -> alias_name )
5327+ var -> is_definition = false;
53275328 }
53285329
53295330 for (Obj * var = prog ; var ; var = var -> next ) {
5330- if (var -> is_definition ) {
5331- if (!var -> is_static || var -> is_used )
5332- mark_live (var );
5333- } else if (!var -> is_static && var -> alias_name ) {
5334- mark_alias_live (var -> alias_name );
5335- }
5331+ if (!var -> is_static || var -> is_used )
5332+ mark_live (var , false);
53365333 }
5334+
53375335 for (Obj * var = prog ; var ; var = var -> next ) {
53385336 if (!var -> is_definition ) {
5339- if ((!var -> is_static && var -> alias_name ) ||
5340- (var -> is_live && (var -> is_weak || var -> visibility ))) {
5341- if (var -> is_weak )
5342- Printftn (".weak \"%s\"" , asm_name (var ));
5343- else
5344- Printftn (".globl \"%s\"" , asm_name (var ));
5345-
5346- if (is_valid_vis (var -> visibility ))
5347- Printftn (".%s \"%s\"" , var -> visibility , asm_name (var ));
5348- if (var -> alias_name )
5349- Printftn (".set \"%s\", \"%s\"" , asm_name (var ), var -> alias_name );
5350- }
5337+ if ((var -> is_weak && var -> is_live ) ||
5338+ (var -> visibility && var -> is_live ) ||
5339+ (var -> alias_name && (var -> is_live || !var -> is_static || var -> is_used )))
5340+ emit_symbol2 (var , asm_name (var ), var -> visibility );
53515341 continue ;
53525342 }
53535343 if (var -> ty -> kind == TY_ASM ) {
0 commit comments