Skip to content

Commit f5ff23b

Browse files
committed
Revise [[gnu::alias()]] logic
1 parent 457251c commit f5ff23b

File tree

1 file changed

+30
-40
lines changed

1 file changed

+30
-40
lines changed

codegen.c

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,6 @@ static char *arith_ins(NodeKind kind);
192192
static void imm_tmpl(char *ins, char *op, int64_t val);
193193

194194
static 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-
231225
static 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

48704868
static 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

Comments
 (0)