diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2008-05-25 22:42:49 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2008-05-25 22:42:49 +0000 |
commit | 3651f7ad941bc7dd797d5e5948c9922da0fb6f8c (patch) | |
tree | 1a3f8d2557f13dd05aa93e2ca0e800b6a5a115c6 /gcc/varasm.c | |
parent | b885a4c1e2ba31aacad53184599c8ae2fc1147e6 (diff) | |
download | gcc-3651f7ad941bc7dd797d5e5948c9922da0fb6f8c.zip gcc-3651f7ad941bc7dd797d5e5948c9922da0fb6f8c.tar.gz gcc-3651f7ad941bc7dd797d5e5948c9922da0fb6f8c.tar.bz2 |
tree-nested.c (convert_tramp_reference): Do not build a trampoline if we don't want one.
* tree-nested.c (convert_tramp_reference) <ADDR_EXPR>: Do not
build a trampoline if we don't want one.
* varasm.c (initializer_constant_valid_p) <ADDR_EXPR>: Do not
return zero for nested functions if we don't want a trampoline.
ada/
* trans.c (Attribute_to_gnu) <Code_Address>: Set TREE_NO_TRAMPOLINE
instead of TREE_STATIC on the ADDR_EXPR.
From-SVN: r135884
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r-- | gcc/varasm.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c index d9468c4..2202ce1 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -4099,25 +4099,29 @@ initializer_constant_valid_p (tree value, tree endtype) case ADDR_EXPR: case FDESC_EXPR: - value = staticp (TREE_OPERAND (value, 0)); - if (value) - { - /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out to - be a constant, this is old-skool offsetof-like nonsense. */ - if (TREE_CODE (value) == INDIRECT_REF - && TREE_CONSTANT (TREE_OPERAND (value, 0))) - return null_pointer_node; - /* Taking the address of a nested function involves a trampoline. */ - if (TREE_CODE (value) == FUNCTION_DECL - && decl_function_context (value) - && !DECL_NO_STATIC_CHAIN (value)) - return NULL_TREE; - /* "&{...}" requires a temporary to hold the constructed - object. */ - if (TREE_CODE (value) == CONSTRUCTOR) - return NULL_TREE; - } - return value; + { + tree op0 = staticp (TREE_OPERAND (value, 0)); + if (op0) + { + /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out + to be a constant, this is old-skool offsetof-like nonsense. */ + if (TREE_CODE (op0) == INDIRECT_REF + && TREE_CONSTANT (TREE_OPERAND (op0, 0))) + return null_pointer_node; + /* Taking the address of a nested function involves a trampoline, + unless we don't need or want one. */ + if (TREE_CODE (op0) == FUNCTION_DECL + && decl_function_context (op0) + && !DECL_NO_STATIC_CHAIN (op0) + && !TREE_NO_TRAMPOLINE (value)) + return NULL_TREE; + /* "&{...}" requires a temporary to hold the constructed + object. */ + if (TREE_CODE (op0) == CONSTRUCTOR) + return NULL_TREE; + } + return op0; + } case VIEW_CONVERT_EXPR: case NON_LVALUE_EXPR: |