From 27c0cafdfc66ce731156bf076644716f240318d4 Mon Sep 17 00:00:00 2001 From: Zuhaitz Méndez Fernández de Aránguiz Date: Tue, 27 Jan 2026 13:19:23 +0000 Subject: Support for custom attributes --- src/codegen/codegen_stmt.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'src/codegen/codegen_stmt.c') diff --git a/src/codegen/codegen_stmt.c b/src/codegen/codegen_stmt.c index c823b13..bd0c816 100644 --- a/src/codegen/codegen_stmt.c +++ b/src/codegen/codegen_stmt.c @@ -684,9 +684,66 @@ void codegen_node_single(ParserContext *ctx, ASTNode *node, FILE *out) } fprintf(out, "section(\"%s\")", node->func.section); } + + Attribute *custom = node->func.attributes; + while (custom) + { + if (!first) + { + fprintf(out, ", "); + } + fprintf(out, "%s", custom->name); + if (custom->arg_count > 0) + { + fprintf(out, "("); + for (int i = 0; i < custom->arg_count; i++) + { + if (i > 0) + { + fprintf(out, ", "); + } + fprintf(out, "%s", custom->args[i]); + } + fprintf(out, ")"); + } + first = 0; + custom = custom->next; + } + #undef EMIT_ATTR fprintf(out, ")) "); } + else if (node->func.attributes) + { + // Handle case where specific attributes are missing but custom ones exist + fprintf(out, "__attribute__(("); + int first = 1; + Attribute *custom = node->func.attributes; + while (custom) + { + if (!first) + { + fprintf(out, ", "); + } + fprintf(out, "%s", custom->name); + if (custom->arg_count > 0) + { + fprintf(out, "("); + for (int i = 0; i < custom->arg_count; i++) + { + if (i > 0) + { + fprintf(out, ", "); + } + fprintf(out, "%s", custom->args[i]); + } + fprintf(out, ")"); + } + first = 0; + custom = custom->next; + } + fprintf(out, ")) "); + } } if (node->func.is_inline) -- cgit v1.2.3