aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/config/i386/i386.h7
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/cp-tree.h26
-rw-r--r--gcc/cp/decl.c6
-rw-r--r--gcc/flags.h4
-rw-r--r--gcc/java/ChangeLog7
-rw-r--r--gcc/java/lang.c7
-rw-r--r--gcc/toplev.c4
-rw-r--r--gcc/tree.h27
-rw-r--r--gcc/varasm.c2
11 files changed, 85 insertions, 28 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index eca9594..346cb9b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2002-10-02 Roger Sayle <roger@eyesopen.com>
+
+ PR optimization/6627
+ * toplev.c (force_align_functions_log): New global variable.
+ * flags.h (force_align_functions_log): Add extern prototype.
+ * varasm.c (assemble_start_function): Use it to force minimum
+ function alignment.
+ * config/i386/i386.h (FUNCTION_BOUNDARY): Set the correct
+ minimum function alignment to one byte.
+ (TARGET_PTRMEMFUNC_VBIT_LOCATION): Store the virtual bit in
+ the least significant bit of vtable member function pointers.
+ * tree.h (enum ptrmemfunc_vbit_where_t): Move definition to
+ here from cp/cp-tree.h.
+
2002-10-02 Matt Austern <austern@apple.com>
* cp/decl.c (walk_vtables_r): Fixed typo that caused result to
never get a nonzero value.
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index af9c37fc..a59168b 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -695,8 +695,11 @@ extern int x86_prefetch_sse;
#define FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN \
(ix86_preferred_stack_boundary > STACK_BOUNDARY && !TARGET_64BIT)
-/* Allocation boundary for the code of a function. */
-#define FUNCTION_BOUNDARY 16
+/* Minimum allocation boundary for the code of a function. */
+#define FUNCTION_BOUNDARY 8
+
+/* C++ stores the virtual bit in the lowest bit of function pointers. */
+#define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_pfn
/* Alignment of field after `int : 0' in a structure. */
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e78f0c2..16c9865 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2002-10-02 Roger Sayle <roger@eyesopen.com>
+
+ PR optimization/6627
+ * cp-tree.h (enum ptrmemfunc_vbit_where_t): Delete definition
+ from here, and move it to tree.h.
+ * decl.c (cxx_init_decl_processing): If storing the vbit
+ in function pointers, ensure that force_align_functions_log
+ is atleast one.
+
2002-10-01 Mark Mitchell <mark@codesourcery.com>
* decl.c (cp_finish_decl): Make sure array types are laid out,
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 3a9c7e7..db19e53 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -2540,32 +2540,6 @@ struct lang_decl GTY(())
member function. [expr.unary.op]/3 */
#define PTRMEM_OK_P(NODE) TREE_LANG_FLAG_0 (NODE)
-/* A pointer-to-function member type looks like:
-
- struct {
- __P __pfn;
- ptrdiff_t __delta;
- };
-
- If __pfn is NULL, it is a NULL pointer-to-member-function.
-
- (Because the vtable is always the first thing in the object, we
- don't need its offset.) If the function is virtual, then PFN is
- one plus twice the index into the vtable; otherwise, it is just a
- pointer to the function.
-
- Unfortunately, using the lowest bit of PFN doesn't work in
- architectures that don't impose alignment requirements on function
- addresses, or that use the lowest bit to tell one ISA from another,
- for example. For such architectures, we use the lowest bit of
- DELTA instead of the lowest bit of the PFN, and DELTA will be
- multiplied by 2. */
-enum ptrmemfunc_vbit_where_t
-{
- ptrmemfunc_vbit_in_pfn,
- ptrmemfunc_vbit_in_delta
-};
-
/* Get the POINTER_TYPE to the METHOD_TYPE associated with this
pointer to member function. TYPE_PTRMEMFUNC_P _must_ be true,
before using this macro. */
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 4c8dbc40..e095f07 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6510,6 +6510,12 @@ cxx_init_decl_processing ()
flag_inline_functions = 0;
}
+ /* Force minimum function alignment if using the least significant
+ bit of function pointers to store the virtual bit. */
+ if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
+ && force_align_functions_log < 1)
+ force_align_functions_log = 1;
+
/* Initially, C. */
current_lang_name = lang_name_c;
diff --git a/gcc/flags.h b/gcc/flags.h
index 1578a24..e0e7b09a 100644
--- a/gcc/flags.h
+++ b/gcc/flags.h
@@ -616,6 +616,10 @@ extern int align_labels_max_skip;
extern int align_functions;
extern int align_functions_log;
+/* Like align_functions_log above, but used by front-ends to force the
+ minimum function alignment. Zero means no alignment is forced. */
+extern int force_align_functions_log;
+
/* Nonzero if we dump in VCG format, not plain text. */
extern int dump_for_graph;
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 07c53ec..1c1c1d0 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,10 @@
+2002-10-02 Roger Sayle <roger@eyesopen.com>
+
+ PR optimization/6627
+ * lang.c (java_init): If storing the vbit in function
+ pointers, ensure that force_align_functions_log is atleast
+ one to aid compatability with g++ vtables.
+
2002-10-01 Nathan Sidwell <nathan@codesourcery.com>
* jcf-dump.c (print_constant, case CONSTANT_float): Don't fall
diff --git a/gcc/java/lang.c b/gcc/java/lang.c
index c6fbb44..706b4f1 100644
--- a/gcc/java/lang.c
+++ b/gcc/java/lang.c
@@ -516,6 +516,13 @@ java_init (filename)
if (flag_inline_functions)
flag_inline_trees = 1;
+ /* Force minimum function alignment if g++ uses the least significant
+ bit of function pointers to store the virtual bit. This is required
+ to keep vtables compatible. */
+ if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
+ && force_align_functions_log < 1)
+ force_align_functions_log = 1;
+
/* Open input file. */
if (filename == 0 || !strcmp (filename, "-"))
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 9121c21..2614427 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -912,6 +912,10 @@ int align_labels_max_skip;
int align_functions;
int align_functions_log;
+/* Like align_functions_log above, but used by front-ends to force the
+ minimum function alignment. Zero means no alignment is forced. */
+int force_align_functions_log;
+
/* Table of supported debugging formats. */
static const struct
{
diff --git a/gcc/tree.h b/gcc/tree.h
index 1d0941c..252c2bc 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2114,6 +2114,33 @@ enum tls_model {
extern enum tls_model flag_tls_default;
+/* A pointer-to-function member type looks like:
+
+ struct {
+ __P __pfn;
+ ptrdiff_t __delta;
+ };
+
+ If __pfn is NULL, it is a NULL pointer-to-member-function.
+
+ (Because the vtable is always the first thing in the object, we
+ don't need its offset.) If the function is virtual, then PFN is
+ one plus twice the index into the vtable; otherwise, it is just a
+ pointer to the function.
+
+ Unfortunately, using the lowest bit of PFN doesn't work in
+ architectures that don't impose alignment requirements on function
+ addresses, or that use the lowest bit to tell one ISA from another,
+ for example. For such architectures, we use the lowest bit of
+ DELTA instead of the lowest bit of the PFN, and DELTA will be
+ multiplied by 2. */
+
+enum ptrmemfunc_vbit_where_t
+{
+ ptrmemfunc_vbit_in_pfn,
+ ptrmemfunc_vbit_in_delta
+};
+
#define NULL_TREE (tree) NULL
/* Approximate positive square root of a host double. This is for
diff --git a/gcc/varasm.c b/gcc/varasm.c
index d24e914..80d076f 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -1171,6 +1171,8 @@ assemble_start_function (decl, fnname)
/* Tell assembler to move to target machine's alignment for functions. */
align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
+ if (align < force_align_functions_log)
+ align = force_align_functions_log;
if (align > 0)
{
ASM_OUTPUT_ALIGN (asm_out_file, align);