Hi Richard Thanks for the comments and pointing out the much cleaner existing asm output functions!
On 29/03/2019 17:51, Richard Henderson wrote: >> +#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) I was trying out these changes but the descsz of 12 gets rejected by readelf. It hits the following unsigned int size = is_32bit_elf ? 4 : 8; printf (_(" Properties: ")); if (pnote->descsz < 8 || (pnote->descsz % size) != 0) { printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz); return; } Thanks Sudi > 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~ >