aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cp/decl.c11
-rw-r--r--gcc/cp/lambda.c9
-rw-r--r--gcc/cp/method.c9
-rw-r--r--gcc/function.h7
-rw-r--r--gcc/java/class.c9
6 files changed, 23 insertions, 30 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cf6e87f..dbaaa9a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 50bb39c..2fb923f 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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)
{
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index b4f19af..c1e7471 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -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);
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index b3e247c..21eb32a 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -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)
diff --git a/gcc/function.h b/gcc/function.h
index e92c17c..b2e4f71 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -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);
diff --git a/gcc/java/class.c b/gcc/java/class.c
index 9e6b45c..8f1288f 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -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. */