mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-20 08:39:01 +08:00
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
This commit is contained in:
parent
327d975a3a
commit
f963b5d977
@ -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.
|
||||
|
@ -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. */
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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. */
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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, "-"))
|
||||
|
@ -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
|
||||
{
|
||||
|
27
gcc/tree.h
27
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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user