[Patch/RFA] Fix mingw/cygwin dllimport PR's 7910 (et al) and 11021
Danny Smith
danny_r_smith_2001@yahoo.co.nz
Sat May 31 14:49:00 GMT 2003
> Is there anything in this change which requires documentation tweaks?
>
> cgf
This add documentation for GCC handling of Windows dllimport/dllexport,
including the modifications in the patch submitted here:
http://gcc.gnu.org/ml/gcc-patches/2003-05/msg02391.html
2003-5-31 Danny Smith <dannysmith@users.sourceforge.net>
* doc/extend.texi(dllimport): Add documentation.
(dllexport): Likewise
(shared): Change Windows NT to just Windows.
*** extend.texi Sat May 31 09:09:48 2003
--- extend.texi.drs Sat May 31 10:35:35 2003
*************** use the normal calling convention based
*** 2563,2568 ****
--- 2563,2673 ----
This attribute can be used to cancel the effect of the @option{-mlong-calls}
option.
+ @item dllimport
+ @cindex @code{__declspec(dllimport)}
+ On Windows targets, the @code{dllimport} attribute causes the compiler
+ to reference a function or variable via a global pointer to a pointer
+ that is set up by the Windows dll library. The pointer name is formed by
+ combining @code{_imp__} and the function or variable name. The attribute
+ implies @code{extern} storage.
+
+ Currently, the attribute is ignored for inlined functions. If the
+ attribute is applied to a symbol @emph{definition}, an error is emitted.
+ If a symbol previousy declared @code{dllimport} is later defined, the
+ attribute is ignored in subsequent references, and a warning is emitted.
+ The attribute is also overriden by a subsequent declaration as
+ @code{dllexport}.
+
+ When applied to C++ classes, the attribute marks static data members,
+ static functions and non-virtual methods as imports. The attribute is
+ ignored for virtual methods to allow vtable lookup using thunks
+ @xref{Vague Linkage}. It is also ignored for inlined member functions
+ and for static constants initialized in-class.
+
+ For example, with
+
+ @smallexample
+ class __attribute__ ((dllimport)) foo
+ @{
+ public:
+ static int static_var;
+ static const int static_const_var = 1;
+ static void fun ();
+ void method1 () const @{@};
+ void method2 () const;
+ virtual void method3 () const;
+ private:
+ int i_;
+ @};
+ @end smallexample
+
+ @code{foo::static_var, foo::fun} and @code{foo::method2} are marked
+ as @code{dllimport}.
+
+ On cygwin, mingw and arm-pe targets, @code{__declspec(dllimport)} is
+ recognized as a synonym for @code{__attribute__ ((dllimport))} for
+ compatibility with other Windows compilers.
+
+ The use of the @code{dllimport} attribute on functions is not necessary,
+ but provides a small performance benefit by eliminating a thunk in the
+ dll. The use of the @code{dllimport} attribute on imported variables was
+ required on older versions of GNU ld, but can now be avoided by passing
+ the @option{--enable-auto-import} switch to ld. As with functions, using
+ the attribute for a variable eliminates a thunk in the dll.
+
+ One drawback to using this attribute is that a pointer to a function or
+ variable marked as dllimport cannot be used as a constant address. The
+ attribute can be disabled for functions by setting the
+ @option{-mnop-fun-dllimport} flag.
+
+ @item dllexport
+ @cindex @code{__declspec(dllexport)}
+ On Windows targets the @code{dllexport} attribute causes the compiler to
+ provide a global pointer to a pointer in a dll, so that it can be
+ referenced with the @code{dllimport} attribute. The pointer name is
+ formed by combining @code{_imp__} and the function or variable name.
+
+ Currently, the @code{dllexport}attribute is ignored for inlined
+ functions, but export can be forced by using the
+ @option{-fkeep-inline-function} flag. The attribute is also ignored for
+ for undefined symbols.
+
+ When applied to C++ classes. the attribute marks non-inlined functions
+ and static data members as exports. Static consts initialized in-class
+ are not marked unless they are also defined out-of-class.
+
+ For example, with
+
+ @smallexample
+ class __attribute__ ((dllexport)) foo
+ @{
+ public:
+ static int static_var;
+ static const int const_int = 1;
+ static void static_fun ();
+ void method1 () const @{@};
+ void method2 () const;
+ virtual void method3 () const;
+ private:
+ int i_;
+ @};
+
+ int foo::static_var;
+ void foo::static_fun () @{@};
+ void foo::method2 () const @{@};
+ @end smallexample
+
+ @code{foo::static_var, foo::fun, foo::method2} and @code{foo::method3}
+ are marked as dllexport.
+
+ On cygwin, mingw and arm-pe targets, @code{__declspec(dllexport)} is
+ recognized as a synonym for @code{__attribute__ ((dllexport))} for
+ compatibility with other Windows compilers.
+
+ Alternative methods for including the symbol in the dll's export table
+ are to use a .def file with an @code{EXPORTS} section, or with GNU ld,
+ using the @option{--export-all} linker flag.
+
@end table
You can specify multiple attributes in a declaration by separating them
*************** section, consider using the facilities o
*** 3147,3153 ****
@item shared
@cindex @code{shared} variable attribute
! On Windows NT, in addition to putting variable definitions in a named
section, the section can also be shared among all running copies of an
executable or DLL@. For example, this small program defines shared data
by putting it in a named section @code{shared} and marking the section
--- 3252,3258 ----
@item shared
@cindex @code{shared} variable attribute
! On Windows, in addition to putting variable definitions in a named
section, the section can also be shared among all running copies of an
executable or DLL@. For example, this small program defines shared data
by putting it in a named section @code{shared} and marking the section
*************** You may only use the @code{shared} attri
*** 3170,3176 ****
attribute with a fully initialized global definition because of the way
linkers work. See @code{section} attribute for more information.
! The @code{shared} attribute is only available on Windows NT@.
@item tls_model ("@var{tls_model}")
@cindex @code{tls_model} attribute
--- 3275,3281 ----
attribute with a fully initialized global definition because of the way
linkers work. See @code{section} attribute for more information.
! The @code{shared} attribute is only available on Windows@.
@item tls_model ("@var{tls_model}")
@cindex @code{tls_model} attribute
*************** the @code{int}.
*** 3227,3232 ****
--- 3332,3344 ----
@item weak
The @code{weak} attribute is described in @xref{Function Attributes}.
+
+ @item dllimport
+ The @code{dllimport} attribute is described in @xref{Function Attributes}.
+
+ @item dllexport
+ The @code{dllexport} attribute is described in @xref{Function Attributes}.
+
@end table
@subsection M32R/D Variable Attributes
http://mobile.yahoo.com.au - Yahoo! Mobile
- Check & compose your email via SMS on your Telstra or Vodafone mobile.
More information about the Gcc-patches
mailing list