https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104596
Bug ID: 104596 Summary: Means to add a comment in the assembly Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: vries at gcc dot gnu.org Target Milestone: --- I wanted to mark some insns in a way that is visible in the assembly, without having to tinker with the .md file. The user-level equivalent would be something like: ... asm ("// Start: added by x") ... asm ("// End: added by x") ... So I wrote: ... static rtx gen_comment (const char *s) { const char *sep = " "; size_t len = strlen (ASM_COMMENT_START) + strlen (sep) + strlen (s) + 1; char *comment = (char *) alloca (len); snprintf (comment, len, "%s%s%s", ASM_COMMENT_START, sep, s); return gen_rtx_ASM_INPUT_loc (VOIDmode, ggc_strdup (comment), cfun->function_start_locus); } ... and used it to generate comments like this: ... // #APP // 2 "pr53465.c" 1 // Start: Added by -minit-regs=3: // #NO_APP mov.u32 %r25, 0; // #APP // 2 "pr53465.c" 1 // End: Added by -minit-regs=3: // #NO_APP ... This however is a bit verbose. The APP/NO_APP is there to separate user insn from compiler insn, but in this case, the compiler added the comments. Furthermore, the file info is not meaningful either, we just use cfun->function_start_locus because with UNKNOWN_LOCATION we run into a segfault. Both these issues are addressed by: ... diff --git a/gcc/final.cc b/gcc/final.cc index a9868861bd2c..5d47f3d5ba0e 100644 --- a/gcc/final.cc +++ b/gcc/final.cc @@ -2642,15 +2642,20 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED, if (string[0]) { expanded_location loc; - - app_enable (); - loc = expand_location (ASM_INPUT_SOURCE_LOCATION (body)); - if (*loc.file && loc.line) - fprintf (asm_out_file, "%s %i \"%s\" 1\n", - ASM_COMMENT_START, loc.line, loc.file); + bool unknown_loc_p + = ASM_INPUT_SOURCE_LOCATION (body) == UNKNOWN_LOCATION; + + if (!unknown_loc_p) + { + app_enable (); + loc = expand_location (ASM_INPUT_SOURCE_LOCATION (body)); + if (*loc.file && loc.line) + fprintf (asm_out_file, "%s %i \"%s\" 1\n", + ASM_COMMENT_START, loc.line, loc.file); + } fprintf (asm_out_file, "\t%s\n", string); #if HAVE_AS_LINE_ZERO - if (*loc.file && loc.line) + if (!unknown_loc_p && loc.file && *loc.file && loc.line) fprintf (asm_out_file, "%s 0 \"\" 2\n", ASM_COMMENT_START); #endif } ... after which we can do in gen_comment: ... - return gen_rtx_ASM_INPUT_loc (VOIDmode, ggc_strdup (comment), - cfun->function_start_locus); + return gen_rtx_ASM_INPUT (VOIDmode, ggc_strdup (comment)); ... and have the less verbose: ... // Start: Added by -minit-regs=3: mov.u32 %r25, 0; // End: Added by -minit-regs=3: ...