From 6afe668ec7a11736a9418a46370af89a8c657ee8 Mon Sep 17 00:00:00 2001 From: seyko Date: Sun, 1 May 2016 22:38:38 +0300 Subject: [PATCH] __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 ++++++++++ tests/tests2/85-asm-outside-function.c | 7 +++++++ tests/tests2/85-asm-outside-function.expect | 0 3 files changed, 17 insertions(+) create mode 100644 tests/tests2/85-asm-outside-function.c create mode 100644 tests/tests2/85-asm-outside-function.expect 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(); diff --git a/tests/tests2/85-asm-outside-function.c b/tests/tests2/85-asm-outside-function.c new file mode 100644 index 0000000..0aa7e33 --- /dev/null +++ b/tests/tests2/85-asm-outside-function.c @@ -0,0 +1,7 @@ +extern void vide(void); +__asm__("vide: ret"); + +int main() { + vide(); + return 0; +} diff --git a/tests/tests2/85-asm-outside-function.expect b/tests/tests2/85-asm-outside-function.expect new file mode 100644 index 0000000..e69de29