diff options
author | Roger Sayle <roger@eyesopen.com> | 2002-10-02 18:46:45 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2002-10-02 18:46:45 +0000 |
commit | f963b5d977a838a7e219bbf7b94f22fd79058a51 (patch) | |
tree | f72d300500fae0fe8ccdc82f9dfd48580a10d90f | |
parent | 327d975a3af27d13a179712ed162e72e19e86b33 (diff) | |
download | gcc-f963b5d977a838a7e219bbf7b94f22fd79058a51.zip gcc-f963b5d977a838a7e219bbf7b94f22fd79058a51.tar.gz gcc-f963b5d977a838a7e219bbf7b94f22fd79058a51.tar.bz2 |
re PR rtl-optimization/6627 (-fno-align-functions regression from 2.95)
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.
* cp/cp-tree.h (enum ptrmemfunc_vbit_where_t): Delete definition
from here, and move it to tree.h.
* cp/decl.c (cxx_init_decl_processing): If storing the vbit
in function pointers, ensure that force_align_functions_log
is atleast one.
* java/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.
From-SVN: r57745
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/config/i386/i386.h | 7 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 26 | ||||
-rw-r--r-- | gcc/cp/decl.c | 6 | ||||
-rw-r--r-- | gcc/flags.h | 4 | ||||
-rw-r--r-- | gcc/java/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/java/lang.c | 7 | ||||
-rw-r--r-- | gcc/toplev.c | 4 | ||||
-rw-r--r-- | gcc/tree.h | 27 | ||||
-rw-r--r-- | gcc/varasm.c | 2 |
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 { @@ -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); |