From 6afe668ec7a11736a9418a46370af89a8c657ee8 Mon Sep 17 00:00:00 2001 From: seyko Date: Sun, 1 May 2016 22:38:38 +0300 Subject: __asm__() outside function gcc/pcc allow __asm__() outside a function body: extern void vide(void); __asm__("vide: ret"); There is many such code in the Linux kernels. --- tccasm.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'tccasm.c') diff --git a/tccasm.c b/tccasm.c index 72121e4..3fd69f7 100644 --- a/tccasm.c +++ b/tccasm.c @@ -824,6 +824,16 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess) opcode = tok; next(); if (tok == ':') { + /* handle "extern void vide(void); __asm__("vide: ret");" as + "__asm__("globl vide\nvide: ret");" */ + Sym *sym = sym_find(opcode); + if (sym && (sym->type.t & VT_EXTERN) && nocode_wanted) { + sym = label_find(opcode); + if (!sym) { + sym = label_push(&s1->asm_labels, opcode, 0); + sym->type.t = VT_VOID; + } + } /* new label */ asm_new_label(s1, opcode, 0); next(); -- cgit v1.3.1