diff options
author | Ilya Leoshkevich <iii@linux.ibm.com> | 2024-01-09 11:40:14 +0100 |
---|---|---|
committer | Ilya Leoshkevich <iii@linux.ibm.com> | 2024-01-12 10:51:53 +0100 |
commit | d8c1361220ba7617adf4ccc396499f6393ec223e (patch) | |
tree | eac8330190da6e9568ea27927cb7bb4a78a845f9 | |
parent | 9073084a0648906c46dea5ed05650e94cf16a6ee (diff) | |
download | gcc-d8c1361220ba7617adf4ccc396499f6393ec223e.zip gcc-d8c1361220ba7617adf4ccc396499f6393ec223e.tar.gz gcc-d8c1361220ba7617adf4ccc396499f6393ec223e.tar.bz2 |
rs6000: Fix ASAN linker errors for Power ELF V1 ABI [PR113284]
rs6000_elf_declare_function_name () outputs Power ELF V1 ABI function
entry labels without using ASM_OUTPUT_FUNCTION_LABEL (). As a result,
.LASANPC labels are not emitted, causing linker errors.
In theory, it is possible to reuse ASM_OUTPUT_FUNCTION_LABEL () by
changing rs6000_output_function_entry () to generate label names
without outputting them, but this would be quite a large change.
Instead, factor out the .LASANPC emitting code from
ASM_OUTPUT_FUNCTION_LABEL () and call it manually.
Fixes: c659dd8bfb55 ("Implement ASM_DECLARE_FUNCTION_NAME using ASM_OUTPUT_FUNCTION_LABEL")
Suggested-by: Jakub Jelinek <jakub@redhat.com>
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
gcc/ChangeLog:
PR sanitizer/113284
* config/rs6000/rs6000.cc (rs6000_elf_declare_function_name):
Use assemble_function_label_final () for Power ELF V1 ABI.
* output.h (assemble_function_label_final): New function.
* varasm.cc (assemble_function_label_raw): Use
assemble_function_label_final ().
(assemble_function_label_final): New function.
-rw-r--r-- | gcc/config/rs6000/rs6000.cc | 1 | ||||
-rw-r--r-- | gcc/output.h | 4 | ||||
-rw-r--r-- | gcc/varasm.cc | 9 |
3 files changed, 14 insertions, 0 deletions
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 94fbf46..5d975da 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -21357,6 +21357,7 @@ rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl) ASM_DECLARE_RESULT (file, DECL_RESULT (decl)); rs6000_output_function_entry (file, name); fputs (":\n", file); + assemble_function_label_final (); return; } diff --git a/gcc/output.h b/gcc/output.h index c8fe1d2..46b0033 100644 --- a/gcc/output.h +++ b/gcc/output.h @@ -182,6 +182,10 @@ extern const char *get_fnname_from_decl (tree); code or data is output after the label. */ extern void assemble_function_label_raw (FILE *, const char *); +/* Finish outputting function label. Needs to be called when outputting + function label without using assemble_function_label_raw (). */ +extern void assemble_function_label_final (void); + /* Output assembler code for the constant pool of a function and associated with defining the name of the function. DECL describes the function. NAME is the function's name. For the constant pool, we use the current diff --git a/gcc/varasm.cc b/gcc/varasm.cc index 1a869ae..2b63382 100644 --- a/gcc/varasm.cc +++ b/gcc/varasm.cc @@ -1843,6 +1843,15 @@ void assemble_function_label_raw (FILE *file, const char *name) { ASM_OUTPUT_LABEL (file, name); + assemble_function_label_final (); +} + +/* Finish outputting function label. Needs to be called when outputting + function label without using assemble_function_label_raw (). */ + +void +assemble_function_label_final (void) +{ if ((flag_sanitize & SANITIZE_ADDRESS) /* Notify ASAN only about the first function label. */ && (in_cold_section_p == first_function_block_is_cold) |