Skip to content

Commit 9c5cabb

Browse files
committed
py: Give error for duplicate label in inline assembler.
1 parent 086a761 commit 9c5cabb

3 files changed

Lines changed: 15 additions & 3 deletions

File tree

py/compile.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3425,7 +3425,10 @@ STATIC void compile_scope_inline_asm(compiler_t *comp, scope_t *scope, pass_kind
34253425
}
34263426
uint lab = comp_next_label(comp);
34273427
if (pass > MP_PASS_SCOPE) {
3428-
EMIT_INLINE_ASM_ARG(label, lab, MP_PARSE_NODE_LEAF_ARG(pn_arg[0]));
3428+
if (!EMIT_INLINE_ASM_ARG(label, lab, MP_PARSE_NODE_LEAF_ARG(pn_arg[0]))) {
3429+
compile_syntax_error(comp, nodes[i], "label redefined");
3430+
return;
3431+
}
34293432
}
34303433
} else if (op == MP_QSTR_align) {
34313434
if (!(n_args == 1 && MP_PARSE_NODE_IS_SMALL_INT(pn_arg[0]))) {

py/emit.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ typedef struct _emit_inline_asm_method_table_t {
193193
void (*start_pass)(emit_inline_asm_t *emit, pass_kind_t pass, scope_t *scope, mp_obj_t *error_slot);
194194
void (*end_pass)(emit_inline_asm_t *emit);
195195
mp_uint_t (*count_params)(emit_inline_asm_t *emit, mp_uint_t n_params, mp_parse_node_t *pn_params);
196-
void (*label)(emit_inline_asm_t *emit, mp_uint_t label_num, qstr label_id);
196+
bool (*label)(emit_inline_asm_t *emit, mp_uint_t label_num, qstr label_id);
197197
void (*align)(emit_inline_asm_t *emit, mp_uint_t align);
198198
void (*data)(emit_inline_asm_t *emit, mp_uint_t bytesize, mp_uint_t val);
199199
void (*op)(emit_inline_asm_t *emit, qstr op, mp_uint_t n_args, mp_parse_node_t *pn_args);

py/emitinlinethumb.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,19 @@ STATIC mp_uint_t emit_inline_thumb_count_params(emit_inline_asm_t *emit, mp_uint
111111
return n_params;
112112
}
113113

114-
STATIC void emit_inline_thumb_label(emit_inline_asm_t *emit, mp_uint_t label_num, qstr label_id) {
114+
STATIC bool emit_inline_thumb_label(emit_inline_asm_t *emit, mp_uint_t label_num, qstr label_id) {
115115
assert(label_num < emit->max_num_labels);
116+
if (emit->pass == MP_PASS_CODE_SIZE) {
117+
// check for duplicate label on first pass
118+
for (int i = 0; i < emit->max_num_labels; i++) {
119+
if (emit->label_lookup[i] == label_id) {
120+
return false;
121+
}
122+
}
123+
}
116124
emit->label_lookup[label_num] = label_id;
117125
asm_thumb_label_assign(emit->as, label_num);
126+
return true;
118127
}
119128

120129
STATIC void emit_inline_thumb_align(emit_inline_asm_t *emit, mp_uint_t align) {

0 commit comments

Comments
 (0)