diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1998-07-28 22:30:29 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1998-07-28 16:30:29 -0600 |
commit | ac478ac0fd632d75ca6b51a104a4ecedaa7bfed6 (patch) | |
tree | 78d997c9ac755b5775a4bd3a500d8a6482dacd83 | |
parent | 28372f4188cf1e6a89b4aa340ab6d5dcb73fe142 (diff) | |
download | gcc-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/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/config/i386/cygwin32.h | 9 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 1 | ||||
-rw-r--r-- | gcc/config/i386/winnt.c | 123 |
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; } |