> +#define ASM_LONG "\t.long\t"
Do not replicate targetm.asm_out.aligned_op.si, or integer_asm_op, really.
> +aarch64_file_end_indicate_exec_stack ()
> +{
> + file_end_indicate_exec_stack ();
> +
> + if (!aarch64_bti_enabled ()
> + && aarch64_ra_sign_scope == AARCH64_FUNCTION_NONE)
> + {
> + return;
> + }
This is redundant with...
> +
> + unsigned feature_1_and = 0;
> + if (aarch64_bti_enabled ())
> + feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI;
> +
> + if (aarch64_ra_sign_scope != AARCH64_FUNCTION_NONE)
> + feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC;
> +
> + if (feature_1_and)
... this. I prefer the second, as it's obvious.
> + ASM_OUTPUT_ALIGN (asm_out_file, p2align);
> + /* name length. */
> + fprintf (asm_out_file, ASM_LONG " 1f - 0f\n");
> + /* data length. */
> + fprintf (asm_out_file, ASM_LONG " 4f - 1f\n");
> + /* note type: NT_GNU_PROPERTY_TYPE_0. */
> + fprintf (asm_out_file, ASM_LONG " 5\n");
> + fprintf (asm_out_file, "0:\n");
> + /* vendor name: "GNU". */
> + fprintf (asm_out_file, STRING_ASM_OP " \"GNU\"\n");
> + fprintf (asm_out_file, "1:\n");
> + ASM_OUTPUT_ALIGN (asm_out_file, p2align);
> + /* pr_type: GNU_PROPERTY_AARCH64_FEATURE_1_AND. */
> + fprintf (asm_out_file, ASM_LONG " 0x%x\n",
> + GNU_PROPERTY_AARCH64_FEATURE_1_AND);
> + /* pr_datasz. */\
> + fprintf (asm_out_file, ASM_LONG " 3f - 2f\n");
> + fprintf (asm_out_file, "2:\n");
> + /* GNU_PROPERTY_AARCH64_FEATURE_1_XXX. */
> + fprintf (asm_out_file, ASM_LONG " 0x%x\n", feature_1_and);
> + fprintf (asm_out_file, "3:\n");
> + ASM_OUTPUT_ALIGN (asm_out_file, p2align);
> + fprintf (asm_out_file, "4:\n");
This could stand to use a comment, a moment's thinking about the sizes, and to
use the existing asm output functions.
/* PT_NOTE header: namesz, descsz, type.
namesz = 4 ("GNU\0")
descsz = 12 (see below)
type = 5 (NT_GNU_PROPERTY_TYPE_0). */
assemble_align (POINTER_SIZE);
assemble_integer (GEN_INT (4), 4, 32, 1);
assemble_integer (GEN_INT (12), 4, 32, 1);
assemble_integer (GEN_INT (5), 4, 32, 1);
/* PT_NOTE name */
assemble_string ("GNU", 4);
/* PT_NOTE contents for NT_GNU_PROPERTY_TYPE_0:
type = 0xc0000000 (GNU_PROPERTY_AARCH64_FEATURE_1_AND),
datasz = 4
data = feature_1_and
Note that the current section offset is 16,
and there has been no padding so far. */
assemble_integer (GEN_INT (0xc0000000), 4, 32, 1);
assemble_integer (GEN_INT (4), 4, 32, 1);
assemble_integer (GEN_INT (feature_1_and), 4, 32, 1);
/* Pad the size of the note to the required alignment. */
assemble_align (POINTER_SIZE);
r~