function.h (MINIMUM_METHOD_BOUNDARY): New macro.

2015-10-26  Christian Bruel  <christian.bruel@st.com>

	* function.h (MINIMUM_METHOD_BOUNDARY): New macro.
	* cp/decl.c (grokfndecl): Set DECL_ALIGN with MINIMUM_METHOD_BOUNDARY.
	* cp/method.c (implicitly_declare_fn): Likewise.
	* cp/lambda.c (maybe_add_lambda_conv_op): Likewise. Remove VBIT setting.
	* java/class.c (add_method_1): Likewise.

From-SVN: r229313
This commit is contained in:
Christian Bruel 2015-10-26 10:50:37 +01:00 committed by Christian Bruel
parent 5929c65918
commit c1fffdf1fb
6 changed files with 23 additions and 30 deletions

View File

@ -1,3 +1,11 @@
2015-10-26 Christian Bruel <christian.bruel@st.com>
* function.h (MINIMUM_METHOD_BOUNDARY): New macro.
* cp/decl.c (grokfndecl): Set DECL_ALIGN with MINIMUM_METHOD_BOUNDARY.
* cp/method.c (implicitly_declare_fn): Likewise.
* cp/lambda.c (maybe_add_lambda_conv_op): Likewise. Remove VBIT setting.
* java/class.c (add_method_1): Likewise.
2015-10-26 Richard Biener <rguenther@suse.de>
* alloc-pool.h (base_pool_allocator): Use placement new.

View File

@ -7829,6 +7829,9 @@ grokfndecl (tree ctype,
parm = build_this_parm (type, quals);
DECL_CHAIN (parm) = parms;
parms = parm;
/* Allocate space to hold the vptr bit if needed. */
DECL_ALIGN (decl) = MINIMUM_METHOD_BOUNDARY;
}
DECL_ARGUMENTS (decl) = parms;
for (t = parms; t; t = DECL_CHAIN (t))
@ -7852,14 +7855,6 @@ grokfndecl (tree ctype,
break;
}
/* If pointers to member functions use the least significant bit to
indicate whether a function is virtual, ensure a pointer
to this function will have that bit clear. */
if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
&& TREE_CODE (type) == METHOD_TYPE
&& DECL_ALIGN (decl) < 2 * BITS_PER_UNIT)
DECL_ALIGN (decl) = 2 * BITS_PER_UNIT;
if (friendp
&& TREE_CODE (orig_declarator) == TEMPLATE_ID_EXPR)
{

View File

@ -1006,11 +1006,7 @@ maybe_add_lambda_conv_op (tree type)
tree convfn = build_lang_decl (FUNCTION_DECL, name, fntype);
tree fn = convfn;
DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop);
if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
&& DECL_ALIGN (fn) < 2 * BITS_PER_UNIT)
DECL_ALIGN (fn) = 2 * BITS_PER_UNIT;
DECL_ALIGN (fn) = MINIMUM_METHOD_BOUNDARY;
SET_OVERLOADED_OPERATOR_CODE (fn, TYPE_EXPR);
grokclassfn (type, fn, NO_SPECIAL);
set_linkage_according_to_type (type, fn);
@ -1042,9 +1038,6 @@ maybe_add_lambda_conv_op (tree type)
tree statfn = build_lang_decl (FUNCTION_DECL, name, stattype);
fn = statfn;
DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop);
if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
&& DECL_ALIGN (fn) < 2 * BITS_PER_UNIT)
DECL_ALIGN (fn) = 2 * BITS_PER_UNIT;
grokclassfn (type, fn, NO_SPECIAL);
set_linkage_according_to_type (type, fn);
rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof);

View File

@ -1849,13 +1849,8 @@ implicitly_declare_fn (special_function_kind kind, tree type,
DECL_ASSIGNMENT_OPERATOR_P (fn) = 1;
SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR);
}
/* If pointers to member functions use the least significant bit to
indicate whether a function is virtual, ensure a pointer
to this function will have that bit clear. */
if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
&& DECL_ALIGN (fn) < 2 * BITS_PER_UNIT)
DECL_ALIGN (fn) = 2 * BITS_PER_UNIT;
DECL_ALIGN (fn) = MINIMUM_METHOD_BOUNDARY;
/* Create the explicit arguments. */
if (rhs_parm_type)

View File

@ -537,6 +537,13 @@ do { \
#define ASLK_REDUCE_ALIGN 1
#define ASLK_RECORD_PAD 2
/* If pointers to member functions use the least significant bit to
indicate whether a function is virtual, ensure a pointer
to this function will have that bit clear. */
#define MINIMUM_METHOD_BOUNDARY \
((TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn) \
? MAX (FUNCTION_BOUNDARY, 2 * BITS_PER_UNIT) : FUNCTION_BOUNDARY)
extern void push_function_context (void);

View File

@ -779,13 +779,8 @@ add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
DECL_CHAIN (fndecl) = TYPE_METHODS (this_class);
TYPE_METHODS (this_class) = fndecl;
/* If pointers to member functions use the least significant bit to
indicate whether a function is virtual, ensure a pointer
to this function will have that bit clear. */
if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
&& !(access_flags & ACC_STATIC)
&& DECL_ALIGN (fndecl) < 2 * BITS_PER_UNIT)
DECL_ALIGN (fndecl) = 2 * BITS_PER_UNIT;
if (!(access_flags & ACC_STATIC))
DECL_ALIGN (fndecl) = MINIMUM_METHOD_BOUNDARY;
/* Notice that this is a finalizer and update the class type
accordingly. This is used to optimize instance allocation. */