re PR c++/35368 (With #pragma visibility, `vtable for __cxxabiv1::__class_type_info' is emitted as a hidden-visibility relocation)

PR c++/35368
	* rtti.c: Include c-pragma.h.
	(push_abi_namespace, pop_abi_namespace): New functions.
	(build_dynamic_cast_1, tinfo_base_init, get_pseudo_ti_index,
	create_tinfo_types, emit_support_tinfos): Use them.
	* Make-lang.in (cp/rtti.o): Depend on $(C_PRAGMA_H).

	* g++.dg/ext/visibility/typeinfo2.C: New test.
	* g++.dg/ext/visibility/typeinfo3.C: New test.

From-SVN: r132704
This commit is contained in:
Jakub Jelinek 2008-02-27 10:09:05 +01:00 committed by Jakub Jelinek
parent a25a8f3be3
commit a15f0fd028
6 changed files with 86 additions and 13 deletions

View File

@ -1,3 +1,12 @@
2008-02-27 Jakub Jelinek <jakub@redhat.com>
PR c++/35368
* rtti.c: Include c-pragma.h.
(push_abi_namespace, pop_abi_namespace): New functions.
(build_dynamic_cast_1, tinfo_base_init, get_pseudo_ti_index,
create_tinfo_types, emit_support_tinfos): Use them.
* Make-lang.in (cp/rtti.o): Depend on $(C_PRAGMA_H).
2008-02-26 Jason Merrill <jason@redhat.com>
PR c++/35315

View File

@ -264,7 +264,7 @@ cp/tree.o: cp/tree.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) toplev.h $(RTL_H) \
$(TARGET_H) debug.h $(TREE_FLOW_H)
cp/ptree.o: cp/ptree.c $(CXX_TREE_H) $(TM_H)
cp/rtti.o: cp/rtti.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) toplev.h convert.h \
$(TARGET_H) gt-cp-rtti.h
$(TARGET_H) $(C_PRAGMA_H) gt-cp-rtti.h
cp/except.o: cp/except.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) $(RTL_H) except.h \
toplev.h cp/cfns.h $(EXPR_H) libfuncs.h $(TREE_INLINE_H) $(TARGET_H)
cp/expr.o: cp/expr.c $(CXX_TREE_H) $(TM_H) $(RTL_H) $(FLAGS_H) $(EXPR_H) \

View File

@ -1,6 +1,6 @@
/* RunTime Type Identification
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005, 2006, 2007
2005, 2006, 2007, 2008
Free Software Foundation, Inc.
Mostly written by Jason Merrill (jason@cygnus.com).
@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see
#include "toplev.h"
#include "convert.h"
#include "target.h"
#include "c-pragma.h"
/* C++ returns type information to the user in struct type_info
objects. We also use type information to implement dynamic_cast and
@ -124,6 +125,19 @@ static bool typeinfo_in_lib_p (tree);
static int doing_runtime = 0;
static void
push_abi_namespace (void)
{
push_nested_namespace (abi_node);
push_visibility ("default");
}
static void
pop_abi_namespace (void)
{
pop_visibility ();
pop_nested_namespace (abi_node);
}
/* Declare language defined type_info type and a pointer to const
type_info. This is incomplete here, and will be completed when
@ -669,10 +683,9 @@ build_dynamic_cast_1 (tree type, tree expr)
{
tree tmp;
tree tinfo_ptr;
tree ns = abi_node;
const char *name;
push_nested_namespace (ns);
push_abi_namespace ();
tinfo_ptr = xref_tag (class_type,
get_identifier ("__class_type_info"),
/*tag_scope=*/ts_current, false);
@ -689,7 +702,7 @@ build_dynamic_cast_1 (tree type, tree expr)
tmp = build_function_type (ptr_type_node, tmp);
dcast_fn = build_library_fn_ptr (name, tmp);
DECL_IS_PURE (dcast_fn) = 1;
pop_nested_namespace (ns);
pop_abi_namespace ();
dynamic_cast_node = dcast_fn;
}
result = build_cxx_call (dcast_fn, 4, elems);
@ -848,10 +861,10 @@ tinfo_base_init (tinfo_s *ti, tree target)
if (!vtable_ptr)
{
tree real_type;
push_nested_namespace (abi_node);
push_abi_namespace ();
real_type = xref_tag (class_type, ti->name,
/*tag_scope=*/ts_current, false);
pop_nested_namespace (abi_node);
pop_abi_namespace ();
if (!COMPLETE_TYPE_P (real_type))
{
@ -1268,14 +1281,14 @@ get_pseudo_ti_index (tree type)
TK_BASE_TYPE)->type,
array_domain);
push_nested_namespace (abi_node);
push_abi_namespace ();
create_pseudo_type_info
(ix, "__vmi_class_type_info",
build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
build_decl (FIELD_DECL, NULL_TREE, base_array),
NULL);
pop_nested_namespace (abi_node);
pop_abi_namespace ();
break;
}
}
@ -1298,7 +1311,7 @@ create_tinfo_types (void)
VEC_safe_grow (tinfo_s, gc, tinfo_descs, TK_FIXED);
push_nested_namespace (abi_node);
push_abi_namespace ();
/* Create the internal type_info structure. This is used as a base for
the other structures. */
@ -1376,7 +1389,7 @@ create_tinfo_types (void)
build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
NULL);
pop_nested_namespace (abi_node);
pop_abi_namespace ();
}
/* Emit the type_info descriptors which are guaranteed to be in the runtime
@ -1404,11 +1417,11 @@ emit_support_tinfos (void)
int ix;
tree bltn_type, dtor;
push_nested_namespace (abi_node);
push_abi_namespace ();
bltn_type = xref_tag (class_type,
get_identifier ("__fundamental_type_info"),
/*tag_scope=*/ts_current, false);
pop_nested_namespace (abi_node);
pop_abi_namespace ();
if (!COMPLETE_TYPE_P (bltn_type))
return;
dtor = CLASSTYPE_DESTRUCTORS (bltn_type);

View File

@ -2,6 +2,10 @@
* gcc.dg/gomp/preprocess-1.c: New test.
PR c++/35368
* g++.dg/ext/visibility/typeinfo2.C: New test.
* g++.dg/ext/visibility/typeinfo3.C: New test.
2008-02-26 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/bf-ms-attrib.c (main): Return 0.

View File

@ -0,0 +1,23 @@
// PR c++/35368
// { dg-require-visibility "" }
#pragma GCC visibility push (hidden)
struct A
{
A();
virtual ~A() { }
};
A::A()
{
}
void foo(A *a)
{
delete a;
}
// { dg-final { scan-not-hidden "_ZTVN10__cxxabiv117__class_type_infoE" } }
// { dg-final { scan-hidden "_ZTI1A" } }
// { dg-final { scan-hidden "_ZTV1A" } }

View File

@ -0,0 +1,24 @@
// PR c++/35368
// { dg-require-visibility "" }
#pragma GCC visibility push (hidden)
#include <typeinfo>
const std::type_info& info1 = typeid(int []);
const std::type_info& info2 = typeid(int);
enum E { e = 0 };
const std::type_info& info3 = typeid(E);
struct S { S (); };
const std::type_info& info4 = typeid(S);
const std::type_info& info5 = typeid(int *);
// { dg-final { scan-not-hidden "_ZTVN10__cxxabiv117__array_type_infoE" } }
// { dg-final { scan-not-hidden "_ZTVN10__cxxabiv116__enum_type_infoE" } }
// { dg-final { scan-hidden "_ZTI1S" } }
// { dg-final { scan-hidden "_ZTS1S" } }
// { dg-final { scan-hidden "info1" } }
// { dg-final { scan-hidden "info2" } }
// { dg-final { scan-hidden "info3" } }
// { dg-final { scan-hidden "info4" } }
// { dg-final { scan-hidden "info5" } }