This commit moves all aarch64-specific code to deal with CIE structure
introduced in
3a67e1a6b4430374f3073e51bb19347d4c421cfe from
target-independent files to the aarch64 backend.
2018-12-13 Sam Tebbs <sam.tebbs@arm.com>
binutils/
* dwarf.c (read_cie): Add check for 'B'.
gas/
* config/tc-aarch64.h (enum pointer_auth_key,
tc_fde_entry_extras, tc_cie_entry_extras, tc_fde_entry_init_extra,
tc_output_cie_extra, tc_cie_fde_equivalent_extra,
tc_cie_entry_init_extra): Define.
* dw2gencfi.c (struct cie_entry): Add tc_cie_entry_extras invocation.
(alloc_fde_entry, select_cie_for_fde): Add tc_fde_entry_init_extra
invocation.
(output_cie): Add tc_output_cie_extra invocation.
(select_cie_for_fde): Add tc_cie_fde_equivalent_extra invocation.
* dw2gencfi.h (enum pointer_auth_key): Move to config/tc-aarch64.h.
(struct fde_entry): Add tc_fde_entry_extras invocation
+2018-12-13 Sam Tebbs <sam.tebbs@arm.com>
+
+ * dwarf.c (read_cie): Add check for 'B'.
+
2018-12-11 Nick Clifton <nickc@redhat.com>
* NEWS: Note that recursion limit has increased to 2048.
fc->fde_encoding = *q++;
else if (*p == 'S')
;
+ else if (*p == 'B')
+ ;
else
break;
p++;
+2018-12-13 Sam Tebbs <sam.tebbs@arm.com>
+
+ * config/tc-aarch64.h (enum pointer_auth_key,
+ tc_fde_entry_extras, tc_cie_entry_extras, tc_fde_entry_init_extra,
+ tc_output_cie_extra, tc_cie_fde_equivalent_extra,
+ tc_cie_entry_init_extra): Define.
+ * dw2gencfi.c (struct cie_entry): Add tc_cie_entry_extras invocation.
+ (alloc_fde_entry, select_cie_for_fde): Add tc_fde_entry_init_extra
+ invocation.
+ (output_cie): Add tc_output_cie_extra invocation.
+ (select_cie_for_fde): Add tc_cie_fde_equivalent_extra invocation.
+ * dw2gencfi.h (enum pointer_auth_key): Move to config/tc-aarch64.h.
+ (struct fde_entry): Add tc_fde_entry_extras invocation
+
2018-12-12 Andre Vieira <andre.simoesdiasvieira@arm.com>
* testsuite/gas/arm/blx-local-thumb.d: Skip arm-nto and
#define tc_frob_section(S) aarch64_frob_section (S)
+/* The key used to sign a function's return address. */
+enum pointer_auth_key {
+ AARCH64_PAUTH_KEY_A,
+ AARCH64_PAUTH_KEY_B
+};
+
+/* The extra fields required by AArch64 in fde_entry and cie_entry. Currently
+ only used to store the key used to sign the frame's return address. */
+#define tc_fde_entry_extras enum pointer_auth_key pauth_key;
+#define tc_cie_entry_extras enum pointer_auth_key pauth_key;
+
+/* The extra initialisation steps needed by AArch64 in alloc_fde_entry.
+ Currently only used to initialise the key used to sign the return
+ address. */
+#define tc_fde_entry_init_extra(fde) fde->pauth_key = AARCH64_PAUTH_KEY_A;
+
+/* Extra checks required by AArch64 when outputting the current cie_entry.
+ Currently only used to output a 'B' if the return address is signed with the
+ B key. */
+#define tc_output_cie_extra(cie) \
+ do \
+ { \
+ if (cie->pauth_key == AARCH64_PAUTH_KEY_B) \
+ out_one ('B'); \
+ } \
+ while (0)
+
+/* Extra equivalence checks required by AArch64 when selecting the correct cie
+ for some fde. Currently only used to check for quivalence between keys used
+ to sign ther return address. */
+#define tc_cie_fde_equivalent_extra(cie, fde) (cie->pauth_key == fde->pauth_key)
+
+/* The extra initialisation steps needed by AArch64 in select_cie_for_fde.
+ Currently only used to initialise the key used to sign the return
+ address. */
+#define tc_cie_entry_init_extra(cie, fde) cie->pauth_key = fde->pauth_key;
+
#define TC_FIX_TYPE struct aarch64_fix
#define TC_INIT_FIX_DATA(FIX) { (FIX)->tc_fix_data.inst = NULL; \
(FIX)->tc_fix_data.opnd = AARCH64_OPND_NIL; }
unsigned char per_encoding;
unsigned char lsda_encoding;
expressionS personality;
- enum pointer_auth_key pauth_key;
+#ifdef tc_cie_entry_extras
+ tc_cie_entry_extras
+#endif
struct cfi_insn_data *first, *last;
};
fde->per_encoding = DW_EH_PE_omit;
fde->lsda_encoding = DW_EH_PE_omit;
fde->eh_header_type = EH_COMPACT_UNKNOWN;
- fde->pauth_key = AARCH64_PAUTH_KEY_A;
+#ifdef tc_fde_entry_init_extra
+ tc_fde_entry_init_extra (fde)
+#endif
return fde;
}
if (cie->lsda_encoding != DW_EH_PE_omit)
out_one ('L');
out_one ('R');
- if (cie->pauth_key == AARCH64_PAUTH_KEY_B)
- out_one ('B');
+#ifdef tc_output_cie_extra
+ tc_output_cie_extra (cie)
+#endif
}
if (cie->signal_frame)
out_one ('S');
{
if (CUR_SEG (cie) != CUR_SEG (fde))
continue;
+#ifdef tc_cie_fde_equivalent_extra
+ if (!tc_cie_fde_equivalent_extra (cie, fde))
+ continue;
+#endif
if (cie->return_column != fde->return_column
- || cie->pauth_key != fde->pauth_key
|| cie->signal_frame != fde->signal_frame
|| cie->per_encoding != fde->per_encoding
|| cie->lsda_encoding != fde->lsda_encoding)
cie->lsda_encoding = fde->lsda_encoding;
cie->personality = fde->personality;
cie->first = fde->data;
- cie->pauth_key = fde->pauth_key;
+#ifdef tc_cie_entry_init_extra
+ tc_cie_entry_init_extra (cie, fde)
+#endif
for (i = cie->first; i ; i = i->next)
if (i->insn == DW_CFA_advance_loc
EH_COMPACT_HAS_LSDA
};
-enum pointer_auth_key {
- AARCH64_PAUTH_KEY_A,
- AARCH64_PAUTH_KEY_B
-};
-
/* Stack of old CFI data, for save/restore. */
struct cfa_save_data
{
/* For out of line tables and FDEs. */
symbolS *eh_loc;
int sections;
- /* The pointer authentication key used. Only used for AArch64. */
- enum pointer_auth_key pauth_key;
+#ifdef tc_fde_entry_extras
+ tc_fde_entry_extras
+#endif
};
/* The list of all FDEs that have been collected. */