gcc/ChangeLog: * config.gcc: Add aarch64-dwarf-metadata.o to extra_objs. * config/aarch64/aarch64-dwarf-metadata.h (class section_note_gnu_property): Encapsulate GNU properties code into a class. * config/aarch64/aarch64.cc (GNU_PROPERTY_AARCH64_FEATURE_1_AND): Define. (GNU_PROPERTY_AARCH64_FEATURE_1_BTI): Likewise. (GNU_PROPERTY_AARCH64_FEATURE_1_PAC): Likewise. (GNU_PROPERTY_AARCH64_FEATURE_1_GCS): Likewise. (aarch64_file_end_indicate_exec_stack): Move GNU properties code to aarch64-dwarf-metadata.cc * config/aarch64/t-aarch64: Declare target aarch64-dwarf-metadata.o * config/aarch64/aarch64-dwarf-metadata.cc: New file. --- gcc/config.gcc | 2 +- gcc/config/aarch64/aarch64-dwarf-metadata.cc | 120 +++++++++++++++++++ gcc/config/aarch64/aarch64-dwarf-metadata.h | 19 +++ gcc/config/aarch64/aarch64.cc | 87 +------------- gcc/config/aarch64/t-aarch64 | 7 ++ 5 files changed, 153 insertions(+), 82 deletions(-) create mode 100644 gcc/config/aarch64/aarch64-dwarf-metadata.cc
diff --git a/gcc/config.gcc b/gcc/config.gcc index f09ce9f63a0..b448c2a91d1 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -351,7 +351,7 @@ aarch64*-*-*) c_target_objs="aarch64-c.o" cxx_target_objs="aarch64-c.o" d_target_objs="aarch64-d.o" - extra_objs="aarch64-builtins.o aarch-common.o aarch64-sve-builtins.o aarch64-sve-builtins-shapes.o aarch64-sve-builtins-base.o aarch64-sve-builtins-sve2.o aarch64-sve-builtins-sme.o cortex-a57-fma-steering.o aarch64-speculation.o falkor-tag-collision-avoidance.o aarch-bti-insert.o aarch64-cc-fusion.o aarch64-early-ra.o aarch64-ldp-fusion.o" + extra_objs="aarch64-builtins.o aarch-common.o aarch64-dwarf-metadata.o aarch64-sve-builtins.o aarch64-sve-builtins-shapes.o aarch64-sve-builtins-base.o aarch64-sve-builtins-sve2.o aarch64-sve-builtins-sme.o cortex-a57-fma-steering.o aarch64-speculation.o falkor-tag-collision-avoidance.o aarch-bti-insert.o aarch64-cc-fusion.o aarch64-early-ra.o aarch64-ldp-fusion.o" target_gtfiles="\$(srcdir)/config/aarch64/aarch64-builtins.h \$(srcdir)/config/aarch64/aarch64-builtins.cc \$(srcdir)/config/aarch64/aarch64-sve-builtins.h \$(srcdir)/config/aarch64/aarch64-sve-builtins.cc" target_has_targetm_common=yes ;; diff --git a/gcc/config/aarch64/aarch64-dwarf-metadata.cc b/gcc/config/aarch64/aarch64-dwarf-metadata.cc new file mode 100644 index 00000000000..36659862b59 --- /dev/null +++ b/gcc/config/aarch64/aarch64-dwarf-metadata.cc @@ -0,0 +1,120 @@ +#define INCLUDE_STRING +#define INCLUDE_ALGORITHM +#define INCLUDE_MEMORY +#define INCLUDE_VECTOR +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "backend.h" +#include "target.h" +#include "rtl.h" +#include "output.h" + +#include "aarch64-dwarf-metadata.h" + +#include <numeric> + +/* Defined for convenience. */ +#define POINTER_BYTES (POINTER_SIZE / BITS_PER_UNIT) + +namespace aarch64 { + +constexpr unsigned GNU_PROPERTY_AARCH64_FEATURE_1_AND = 0xc0000000; +constexpr unsigned GNU_PROPERTY_AARCH64_FEATURE_1_BTI = (1U << 0); +constexpr unsigned GNU_PROPERTY_AARCH64_FEATURE_1_PAC = (1U << 1); +constexpr unsigned GNU_PROPERTY_AARCH64_FEATURE_1_GCS = (1U << 2); + +namespace { + +std::string join_s (std::string s1, const std::string &s2) +{ + constexpr const char* separator = ", "; + return std::move (s1) + .append (separator) + .append (s2); +}; + +std::string gnu_property_features_to_string (unsigned feature_1_and) +{ + std::vector<std::string> feature_bits; + + if (feature_1_and & GNU_PROPERTY_AARCH64_FEATURE_1_BTI) + feature_bits.push_back ("BTI"); + if (feature_1_and & GNU_PROPERTY_AARCH64_FEATURE_1_PAC) + feature_bits.push_back ("PAC"); + if (feature_1_and & GNU_PROPERTY_AARCH64_FEATURE_1_GCS) + feature_bits.push_back ("GCS"); + + if (feature_bits.empty ()) + return {}; + + return std::accumulate(std::next(feature_bits.cbegin()), feature_bits.cend(), + feature_bits[0], join_s); +}; + +} // namespace anonymous + +section_note_gnu_property::section_note_gnu_property(): + feature_1_and(0) +{} + +void section_note_gnu_property::bti_enabled() +{ + feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI; +} + +void section_note_gnu_property::pac_enabled() +{ + feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC; +} + +void section_note_gnu_property::gcs_enabled() +{ + feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_GCS; +} + +void section_note_gnu_property::write () const +{ + if (feature_1_and) + { + /* Generate .note.gnu.property section. */ + switch_to_section (get_section (".note.gnu.property", + SECTION_NOTYPE, NULL)); + + /* PT_NOTE header: namesz, descsz, type. + namesz = 4 ("GNU\0") + descsz = 16 (Size of the program property array) + [(12 + padding) * Number of array elements] + type = 5 (NT_GNU_PROPERTY_TYPE_0). */ + assemble_align (POINTER_SIZE); + assemble_integer (GEN_INT (4), 4, 32, 1); + assemble_integer (GEN_INT (ROUND_UP (12, POINTER_BYTES)), 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 = GNU_PROPERTY_AARCH64_FEATURE_1_AND + datasz = 4 + data = feature_1_and. */ + assemble_integer (GEN_INT (GNU_PROPERTY_AARCH64_FEATURE_1_AND), 4, 32, 1); + assemble_integer (GEN_INT (4), 4, 32, 1); + + if (!flag_debug_asm) + assemble_integer (GEN_INT (feature_1_and), 4, 32, 1); + else + { + asm_fprintf (asm_out_file, "\t.word\t%u", feature_1_and); + auto const& s_features + = gnu_property_features_to_string (feature_1_and); + asm_fprintf (asm_out_file, + "\t%s GNU_PROPERTY_AARCH64_FEATURE_1_AND (%s)\n", + ASM_COMMENT_START, s_features.c_str ()); + } + /* Pad the size of the note to the required alignment. */ + assemble_align (POINTER_SIZE); + } +} + +} // namespace aarch64 \ No newline at end of file diff --git a/gcc/config/aarch64/aarch64-dwarf-metadata.h b/gcc/config/aarch64/aarch64-dwarf-metadata.h index 9638bc7702f..006baa502f5 100644 --- a/gcc/config/aarch64/aarch64-dwarf-metadata.h +++ b/gcc/config/aarch64/aarch64-dwarf-metadata.h @@ -242,6 +242,25 @@ class aeabi_subsection auto_vec<aeabi_attribute<T_tag, T_val>, N> attributes_; }; +class section_note_gnu_property +{ + public: + section_note_gnu_property(); + + /* Add BTI flag to GNU properties. */ + void bti_enabled(); + /* Add GCS flag to GNU properties. */ + void gcs_enabled(); + /* Add PAC flag to GNU properties. */ + void pac_enabled(); + + /* Write the data to the assembly file. */ + void write () const; + + private: + unsigned feature_1_and; +}; + } // namespace aarch64 #endif /* GCC_AARCH64_DWARF_METADATA_H */ \ No newline at end of file diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 0cc8a5ee9ad..80af44d9a8f 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -99,8 +99,6 @@ #include "ipa-fnsummary.h" #include "hash-map.h" -#include <numeric> - /* This file should be included last. */ #include "target-def.h" @@ -29105,97 +29103,24 @@ aarch64_can_tag_addresses () /* Implement TARGET_ASM_FILE_END for AArch64. This adds the AArch64 GNU NOTE section at the end if needed. */ -#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000 -#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI (1U << 0) -#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC (1U << 1) -#define GNU_PROPERTY_AARCH64_FEATURE_1_GCS (1U << 2) void aarch64_file_end_indicate_exec_stack () { file_end_indicate_exec_stack (); - unsigned feature_1_and = 0; + aarch64::section_note_gnu_property gnu_properties; + if (aarch_bti_enabled ()) - feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI; + gnu_properties.bti_enabled (); if (aarch_ra_sign_scope != AARCH_FUNCTION_NONE) - feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC; + gnu_properties.pac_enabled (); if (aarch64_gcs_enabled ()) - feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_GCS; - - if (feature_1_and) - { - /* Generate .note.gnu.property section. */ - switch_to_section (get_section (".note.gnu.property", - SECTION_NOTYPE, NULL)); + gnu_properties.gcs_enabled (); - /* PT_NOTE header: namesz, descsz, type. - namesz = 4 ("GNU\0") - descsz = 16 (Size of the program property array) - [(12 + padding) * Number of array elements] - type = 5 (NT_GNU_PROPERTY_TYPE_0). */ - assemble_align (POINTER_SIZE); - assemble_integer (GEN_INT (4), 4, 32, 1); - assemble_integer (GEN_INT (ROUND_UP (12, POINTER_BYTES)), 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 = GNU_PROPERTY_AARCH64_FEATURE_1_AND - datasz = 4 - data = feature_1_and. */ - assemble_integer (GEN_INT (GNU_PROPERTY_AARCH64_FEATURE_1_AND), 4, 32, 1); - assemble_integer (GEN_INT (4), 4, 32, 1); - - if (!flag_debug_asm) - assemble_integer (GEN_INT (feature_1_and), 4, 32, 1); - else - { - asm_fprintf (asm_out_file, "\t.word\t%u", feature_1_and); - - auto join_s = [] (std::string s1, - const std::string &s2, - const std::string &separator = ", ") -> std::string - { - return std::move (s1) - .append (separator) - .append (s2); - }; - - auto features_to_string - = [&join_s] (unsigned feature_1_and) -> std::string - { - std::vector<std::string> feature_bits; - if (feature_1_and & GNU_PROPERTY_AARCH64_FEATURE_1_BTI) - feature_bits.push_back ("BTI"); - if (feature_1_and & GNU_PROPERTY_AARCH64_FEATURE_1_PAC) - feature_bits.push_back ("PAC"); - if (feature_1_and & GNU_PROPERTY_AARCH64_FEATURE_1_GCS) - feature_bits.push_back ("GCS"); - - if (feature_bits.empty ()) - return {}; - return std::accumulate(std::next(feature_bits.cbegin()), - feature_bits.cend(), - feature_bits[0], - join_s); - }; - auto const& s_features = features_to_string (feature_1_and); - asm_fprintf (asm_out_file, - "\t%s GNU_PROPERTY_AARCH64_FEATURE_1_AND (%s)\n", - ASM_COMMENT_START, s_features.c_str ()); - } - /* Pad the size of the note to the required alignment. */ - assemble_align (POINTER_SIZE); - } + gnu_properties.write (); } -#undef GNU_PROPERTY_AARCH64_FEATURE_1_GCS -#undef GNU_PROPERTY_AARCH64_FEATURE_1_PAC -#undef GNU_PROPERTY_AARCH64_FEATURE_1_BTI -#undef GNU_PROPERTY_AARCH64_FEATURE_1_AND /* Helper function for straight line speculation. Return what barrier should be emitted for straight line speculation diff --git a/gcc/config/aarch64/t-aarch64 b/gcc/config/aarch64/t-aarch64 index c2a0715e9ab..194e3a4ac99 100644 --- a/gcc/config/aarch64/t-aarch64 +++ b/gcc/config/aarch64/t-aarch64 @@ -139,6 +139,13 @@ aarch-common.o: $(srcdir)/config/arm/aarch-common.cc $(CONFIG_H) $(SYSTEM_H) \ $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ $(srcdir)/config/arm/aarch-common.cc +aarch64-dwarf-metadata.o: $(srcdir)/config/aarch64/aarch64-dwarf-metadata.cc \ + $(CONFIG_H) \ + $(SYSTEM_H) \ + $(TARGET_H) + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_SPPFLAGS) $(INCLUDES) \ + $(srcdir)/config/aarch64/aarch64-dwarf-metadata.cc + aarch64-c.o: $(srcdir)/config/aarch64/aarch64-c.cc $(CONFIG_H) $(SYSTEM_H) \ coretypes.h $(TM_H) $(TREE_H) output.h $(C_COMMON_H) $(TARGET_H) $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ -- 2.46.1