public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/ARM/heads/morello)] Declare all constants with an associated size
@ 2021-09-21 9:14 Matthew Malcomson
0 siblings, 0 replies; only message in thread
From: Matthew Malcomson @ 2021-09-21 9:14 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:e3653f9e4f8bbd822de3ab7db22a3b10f8a9895d
commit e3653f9e4f8bbd822de3ab7db22a3b10f8a9895d
Author: Matthew Malcomson <matthew.malcomson@arm.com>
Date: Thu Sep 16 11:33:49 2021 +0100
Declare all constants with an associated size
For PureCap we have introduced an indirection layer for loading the
address of objects. For each indirected object, rather than calculate a
pointer directly we load a capability from a table. The runtime
populates this table. To populate the table we create a CAPINIT
relocation for each entry. The linker requires a size for every symbol
that we create a CAPINIT relocation for.
This patch adds a `.size` directive to all constants with a DECL by
implementing the `TARGET_ASM_DECLARE_CONSTANT_NAME` target hook.
It adds a `.size` directive to every CONSTANT_POOL_ADDRESS_P symbol by
adding the relevant code to `output_constant_pool_1`. It adds a `.size`
directive to the .LTRAMP0 symbol in `assemble_trampoline_template`.
There is still more work to do in this area -- there are more instances
of this linker complaint in the testsuite -- but these are only for
symbols that have an explicit size of zero. Such symbols are currently
given the bounds of the entire section, and investigation into any
alternative is a task for the future.
This commit also adds a `.type` directive on each such object since we
are adding the `.size` directive and specifying that these things are
objects seems a nice add-on.
We also introduce a helper function that emits the `.type` and `.size`
directives for an object given its size.
This patch removes a lot of link errors in the testsuite after the
introduction of the indirection table containing `.capinit` relocations
for any symbol that is loaded in code.
Diff:
---
gcc/config/aarch64/aarch64.c | 12 ++++++++++++
gcc/output.h | 5 +++++
gcc/varasm.c | 17 ++++++++++++++++-
3 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 6f34ee8c672..53b479e8c9d 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -11636,6 +11636,15 @@ aarch64_use_anchors_for_symbol_p (const_rtx x)
return default_use_anchors_for_symbol_p (x);
}
+static void
+aarch64_declare_constant_name (FILE *file, const char *name,
+ const_tree exp ATTRIBUTE_UNUSED,
+ HOST_WIDE_INT size)
+{
+ assemble_object_type_and_size (file, name, size);
+ return default_asm_declare_constant_name (file, name, exp, size);
+}
+
/* Select appropriate section for constants depending
on where we place literal pools. */
@@ -24814,6 +24823,9 @@ aarch64_libgcc_floating_mode_supported_p
#undef TARGET_CAPABILITY_MODE
#define TARGET_CAPABILITY_MODE aarch64_target_capability_mode
+#undef TARGET_ASM_DECLARE_CONSTANT_NAME
+#define TARGET_ASM_DECLARE_CONSTANT_NAME aarch64_declare_constant_name
+
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-aarch64.h"
diff --git a/gcc/output.h b/gcc/output.h
index 378fd196b2f..8705aeb2981 100644
--- a/gcc/output.h
+++ b/gcc/output.h
@@ -231,6 +231,11 @@ extern void assemble_external_libcall (rtx);
/* Assemble a label named NAME. */
extern void assemble_label (FILE *, const char *);
+/* Assemble the type and size directives associated with a label.
+ Assume that the label is an object (since all use cases at the moment are
+ for objects. */
+extern void assemble_object_type_and_size (FILE *, const char *, HOST_WIDE_INT);
+
/* Output to FILE (an assembly file) a reference to NAME. If NAME
starts with a *, the rest of NAME is output verbatim. Otherwise
NAME is transformed in a target-specific way (usually by the
diff --git a/gcc/varasm.c b/gcc/varasm.c
index d5f41d5ec25..c3c0d1959a5 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -2514,6 +2514,15 @@ assemble_label (FILE *file, const char *name)
ASM_OUTPUT_LABEL (file, name);
}
+void
+assemble_object_type_and_size (FILE *file, const char *in_name,
+ HOST_WIDE_INT size)
+{
+ const char *name = targetm.strip_name_encoding (in_name);
+ asm_fprintf (file, "\t.type\t%s, %%object\n", name);
+ asm_fprintf (file, "\t.size\t%s, %" PRId64 "\n", name, size);
+}
+
/* Set the symbol_referenced flag for ID. */
void
mark_referenced (tree id)
@@ -2681,6 +2690,9 @@ assemble_trampoline_template (void)
set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT);
set_mem_size (initial_trampoline, TRAMPOLINE_SIZE);
+ /* Output the relevant size for the trampoline. */
+ assemble_object_type_and_size (asm_out_file, label, TRAMPOLINE_SIZE);
+
return initial_trampoline;
}
\f
@@ -4105,7 +4117,10 @@ output_constant_pool_1 (class constant_descriptor_rtx *desc,
assemble_align (align);
/* Output the label. */
- targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
+ char buf[42];
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LC", desc->labelno);
+ assemble_object_type_and_size (asm_out_file, buf, GET_MODE_SIZE (desc->mode));
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, buf);
/* Output the data.
Pass actual alignment value while emitting string constant to asm code
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-09-21 9:14 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-21 9:14 [gcc(refs/vendors/ARM/heads/morello)] Declare all constants with an associated size Matthew Malcomson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).