From c1fffdf1fb2ebce24620195c4add32eb90daa598 Mon Sep 17 00:00:00 2001 From: Christian Bruel Date: Mon, 26 Oct 2015 10:50:37 +0100 Subject: [PATCH] function.h (MINIMUM_METHOD_BOUNDARY): New macro. 2015-10-26 Christian Bruel * 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 --- gcc/ChangeLog | 8 ++++++++ gcc/cp/decl.c | 11 +++-------- gcc/cp/lambda.c | 9 +-------- gcc/cp/method.c | 9 ++------- gcc/function.h | 7 +++++++ gcc/java/class.c | 9 ++------- 6 files changed, 23 insertions(+), 30 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cf6e87fb1ab..dbaaa9a4f17 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-10-26 Christian Bruel + + * 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 * alloc-pool.h (base_pool_allocator): Use placement new. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 50bb39c8f9a..2fb923f11bf 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 b4f19af6eff..c1e747173eb 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 b3e247c5b1f..21eb32aedd7 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 e92c17c6fcc..b2e4f7141c2 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 9e6b45c4467..8f1288f8584 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. */ -- 2.30.2