aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1998-07-28 22:30:29 +0000
committerJeff Law <law@gcc.gnu.org>1998-07-28 16:30:29 -0600
commitac478ac0fd632d75ca6b51a104a4ecedaa7bfed6 (patch)
tree78d997c9ac755b5775a4bd3a500d8a6482dacd83
parent28372f4188cf1e6a89b4aa340ab6d5dcb73fe142 (diff)
downloadgcc-ac478ac0fd632d75ca6b51a104a4ecedaa7bfed6.zip
gcc-ac478ac0fd632d75ca6b51a104a4ecedaa7bfed6.tar.gz
gcc-ac478ac0fd632d75ca6b51a104a4ecedaa7bfed6.tar.bz2
cygwin32.h (VALID_MACHINE_TYPE_ATTRIBUTE): New macro.
Tue Jul 28 23:29:04 1998 Jason Merrill <jason@yorick.cygnus.com> * i386/cygwin32.h (VALID_MACHINE_TYPE_ATTRIBUTE): New macro. * i386/winnt.c (associated_type): New fn. (i386_pe_valid_type_attribute_p): New fn. (i386_pe_check_vtable_importexport): Remove. (i386_pe_dllexport_p): Use associated_type. (i386_pe_dllimport_p): Likewise. From Antonio M. O. Neto <anmendes@cruzeironet.com.br>: * i386.c (i386_valid_type_attribute_p): Also accept attributes for METHOD_TYPEs. From-SVN: r21456
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config/i386/cygwin32.h9
-rw-r--r--gcc/config/i386/i386.c1
-rw-r--r--gcc/config/i386/winnt.c123
4 files changed, 80 insertions, 66 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6ce20d0..5696d4d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+Tue Jul 28 23:29:04 1998 Jason Merrill <jason@yorick.cygnus.com>
+
+ * i386/cygwin32.h (VALID_MACHINE_TYPE_ATTRIBUTE): New macro.
+ * i386/winnt.c (associated_type): New fn.
+ (i386_pe_valid_type_attribute_p): New fn.
+ (i386_pe_check_vtable_importexport): Remove.
+ (i386_pe_dllexport_p): Use associated_type.
+ (i386_pe_dllimport_p): Likewise.
+
+ From Antonio M. O. Neto <anmendes@cruzeironet.com.br>:
+ * i386.c (i386_valid_type_attribute_p): Also accept
+ attributes for METHOD_TYPEs.
+
Tue Jul 28 23:17:39 1998 Peter Gerwinski <peter@gerwinski.de>
* tree.c (build_range_type): Copy TYPE_SIZE_UNIT.
diff --git a/gcc/config/i386/cygwin32.h b/gcc/config/i386/cygwin32.h
index 5ccc51d..66b0f74 100644
--- a/gcc/config/i386/cygwin32.h
+++ b/gcc/config/i386/cygwin32.h
@@ -98,6 +98,15 @@ extern int i386_pe_valid_decl_attribute_p ();
#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \
i386_pe_valid_decl_attribute_p (DECL, ATTRIBUTES, IDENTIFIER, ARGS)
+/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
+ is a valid machine specific attribute for TYPE.
+ The attributes in ATTRIBUTES have previously been assigned to TYPE. */
+
+#undef VALID_MACHINE_TYPE_ATTRIBUTE
+#define VALID_MACHINE_TYPE_ATTRIBUTE(TYPE, ATTRIBUTES, IDENTIFIER, ARGS) \
+ i386_pe_valid_type_attribute_p (TYPE, ATTRIBUTES, IDENTIFIER, ARGS)
+extern int i386_pe_valid_type_attribute_p ();
+
extern union tree_node *i386_pe_merge_decl_attributes ();
#define MERGE_MACHINE_DECL_ATTRIBUTES(OLD, NEW) \
i386_pe_merge_decl_attributes ((OLD), (NEW))
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index a529b0f..73036ea 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -546,6 +546,7 @@ i386_valid_type_attribute_p (type, attributes, identifier, args)
tree args;
{
if (TREE_CODE (type) != FUNCTION_TYPE
+ && TREE_CODE (type) != METHOD_TYPE
&& TREE_CODE (type) != FIELD_DECL
&& TREE_CODE (type) != TYPE_DECL)
return 0;
diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c
index 95daf14..f78b709 100644
--- a/gcc/config/i386/winnt.c
+++ b/gcc/config/i386/winnt.c
@@ -50,17 +50,40 @@ i386_pe_valid_decl_attribute_p (decl, attributes, attr, args)
tree attr;
tree args;
{
- if (args != NULL_TREE)
- return 0;
-
- if (is_attribute_p ("dllexport", attr))
- return 1;
- if (is_attribute_p ("dllimport", attr))
- return 1;
+ if (args == NULL_TREE)
+ {
+ if (is_attribute_p ("dllexport", attr))
+ return 1;
+ if (is_attribute_p ("dllimport", attr))
+ return 1;
+ }
return i386_valid_decl_attribute_p (decl, attributes, attr, args);
}
+/* Return nonzero if ATTR is a valid attribute for TYPE.
+ ATTRIBUTES are any existing attributes and ARGS are the arguments
+ supplied with ATTR. */
+
+int
+i386_pe_valid_type_attribute_p (type, attributes, attr, args)
+ tree type;
+ tree attributes;
+ tree attr;
+ tree args;
+{
+ if (args == NULL_TREE
+ && (TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE))
+ {
+ if (is_attribute_p ("dllexport", attr))
+ return 1;
+ if (is_attribute_p ("dllimport", attr))
+ return 1;
+ }
+
+ return i386_valid_type_attribute_p (type, attributes, attr, args);
+}
+
/* Merge attributes in decls OLD and NEW.
This handles the following situation:
@@ -114,49 +137,33 @@ i386_pe_merge_decl_attributes (old, new)
return a;
}
-/* Check a type that has a virtual table, and see if any virtual methods are
- marked for import or export, and if so, arrange for the vtable to
- be imported or exported. */
+/* Return the type that we should use to determine if DECL is
+ imported or exported. */
-static int
-i386_pe_check_vtable_importexport (type)
- tree type;
+static tree
+associated_type (decl)
+ tree decl;
{
- tree methods = TYPE_METHODS (type);
- tree fndecl;
-
- if (TREE_CODE (methods) == FUNCTION_DECL)
- fndecl = methods;
- else if (TREE_VEC_ELT (methods, 0) != NULL_TREE)
- fndecl = TREE_VEC_ELT (methods, 0);
- else
- fndecl = TREE_VEC_ELT (methods, 1);
+ tree t = NULL_TREE;
- while (fndecl)
+ /* In the C++ frontend, DECL_CONTEXT for a method doesn't actually refer
+ to the containing class. So we look at the 'this' arg. */
+ if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
{
- if (DECL_VIRTUAL_P (fndecl) || DECL_VINDEX (fndecl) != NULL_TREE)
- {
- tree exp = lookup_attribute ("dllimport",
- DECL_MACHINE_ATTRIBUTES (fndecl));
- if (exp == 0)
- exp = lookup_attribute ("dllexport",
- DECL_MACHINE_ATTRIBUTES (fndecl));
- if (exp)
- return 1;
- }
-
- fndecl = TREE_CHAIN (fndecl);
+ /* Artificial methods are not affected by the import/export status of
+ their class unless they are virtual. */
+ if (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl))
+ t = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))));
}
+ else if (DECL_CONTEXT (decl)
+ && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (decl))) == 't')
+ t = DECL_CONTEXT (decl);
- return 0;
+ return t;
}
/* Return non-zero if DECL is a dllexport'd object. */
-#if 0
-tree current_class_type; /* FIXME */
-#endif
-
int
i386_pe_dllexport_p (decl)
tree decl;
@@ -170,22 +177,14 @@ i386_pe_dllexport_p (decl)
if (exp)
return 1;
-#if 0 /* This was a hack to get vtable's exported or imported since only one
- copy of them is ever output. Disabled pending better solution. */
- /* For C++, the vtables might have to be marked. */
- if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl))
+ /* Class members get the dllexport status of their class. */
+ if (associated_type (decl))
{
- if (TREE_PUBLIC (decl)
- && DECL_EXTERNAL (decl) == 0
- && (DECL_CONTEXT (decl)
- ? i386_pe_check_vtable_importexport (DECL_CONTEXT (decl))
- : current_class_type
- ? i386_pe_check_vtable_importexport (current_class_type)
- : 0)
- )
+ exp = lookup_attribute ("dllexport",
+ TYPE_ATTRIBUTES (associated_type (decl)));
+ if (exp)
return 1;
}
-#endif
return 0;
}
@@ -209,22 +208,14 @@ i386_pe_dllimport_p (decl)
if (imp)
return 1;
-#if 0 /* This was a hack to get vtable's exported or imported since only one
- copy of them is ever output. Disabled pending better solution. */
- /* For C++, the vtables might have to be marked. */
- if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl))
+ /* Class members get the dllimport status of their class. */
+ if (associated_type (decl))
{
- if (TREE_PUBLIC (decl)
- && DECL_EXTERNAL (decl)
- && (DECL_CONTEXT (decl)
- ? i386_pe_check_vtable_importexport (DECL_CONTEXT (decl))
- : current_class_type
- ? i386_pe_check_vtable_importexport (current_class_type)
- : 0)
- )
+ imp = lookup_attribute ("dllimport",
+ TYPE_ATTRIBUTES (associated_type (decl)));
+ if (imp)
return 1;
}
-#endif
return 0;
}