c.opt (-fkeep-inline-dllexport): New switch.
gcc/c-family/ChangeLog: * c.opt (-fkeep-inline-dllexport): New switch. gcc/ChangeLog: * tree.c (handle_dll_attribute): Handle it. * doc/extend.texi (@item dllexport): Mention it. * doc/invoke.texi (@item -fno-keep-inline-dllexport): Document it. gcc/cp/ChangeLog: * semantics.c (expand_or_defer_fn_1): Handle it. * decl2.c (decl_needed_p): Likewise. gcc/testsuite/ChangeLog: * gcc.dg/dll-9a.c: New test file. * gcc.dg/dll-11.c: Likewise. * gcc.dg/dll-12.c: Likewise. * gcc.dg/dll-12a.c: Likewise. * gcc.dg/dll-11a.c: Likewise. * gcc.dg/dll-9.c: Likewise. * gcc.dg/dll-10.c: Likewise. * gcc.dg/dll-10a.c: Likewise. * g++.dg/ext/dllexport4a.cc: Likewise. * g++.dg/ext/dllexport4.C: Likewise. * g++.dg/ext/dllexport5.C: Likewise. * g++.dg/ext/dllexport5a.cc: Likewise. From-SVN: r169268
This commit is contained in:
parent
744f0946bc
commit
47ea1edfbc
|
@ -1,3 +1,9 @@
|
||||||
|
2011-01-26 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||||
|
|
||||||
|
* tree.c (handle_dll_attribute): Handle it.
|
||||||
|
* doc/extend.texi (@item dllexport): Mention it.
|
||||||
|
* doc/invoke.texi (@item -fno-keep-inline-dllexport): Document it.
|
||||||
|
|
||||||
2011-01-25 Ian Lance Taylor <iant@google.com>
|
2011-01-25 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
PR tree-optimization/26854
|
PR tree-optimization/26854
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2011-01-26 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||||
|
|
||||||
|
* c.opt (-fkeep-inline-dllexport): New switch.
|
||||||
|
|
||||||
2011-01-12 Richard Guenther <rguenther@suse.de>
|
2011-01-12 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
PR middle-end/32511
|
PR middle-end/32511
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
; Options for the C, ObjC, C++ and ObjC++ front ends.
|
; Options for the C, ObjC, C++ and ObjC++ front ends.
|
||||||
; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||||
; Free Software Foundation, Inc.
|
; 2011 Free Software Foundation, Inc.
|
||||||
;
|
;
|
||||||
; This file is part of GCC.
|
; This file is part of GCC.
|
||||||
;
|
;
|
||||||
|
@ -814,6 +814,10 @@ ffriend-injection
|
||||||
C++ ObjC++ Var(flag_friend_injection)
|
C++ ObjC++ Var(flag_friend_injection)
|
||||||
Inject friend functions into enclosing namespace
|
Inject friend functions into enclosing namespace
|
||||||
|
|
||||||
|
fkeep-inline-dllexport
|
||||||
|
C C++ ObjC ObjC++ Var(flag_keep_inline_dllexport) Init(1) Report Condition(TARGET_DLLIMPORT_DECL_ATTRIBUTES)
|
||||||
|
Don't emit dllexported inline functions unless needed
|
||||||
|
|
||||||
flabels-ok
|
flabels-ok
|
||||||
C++ ObjC++ Ignore Warn(switch %qs is no longer supported)
|
C++ ObjC++ Ignore Warn(switch %qs is no longer supported)
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2011-01-26 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||||
|
|
||||||
|
* semantics.c (expand_or_defer_fn_1): Handle it.
|
||||||
|
* decl2.c (decl_needed_p): Likewise.
|
||||||
|
|
||||||
2011-01-21 Jason Merrill <jason@redhat.com>
|
2011-01-21 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
PR c++/47041
|
PR c++/47041
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* Process declarations and variables for C++ compiler.
|
/* Process declarations and variables for C++ compiler.
|
||||||
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
||||||
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
|
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010,
|
||||||
Free Software Foundation, Inc.
|
2011 Free Software Foundation, Inc.
|
||||||
Hacked by Michael Tiemann (tiemann@cygnus.com)
|
Hacked by Michael Tiemann (tiemann@cygnus.com)
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
@ -1781,7 +1781,8 @@ decl_needed_p (tree decl)
|
||||||
return true;
|
return true;
|
||||||
/* Functions marked "dllexport" must be emitted so that they are
|
/* Functions marked "dllexport" must be emitted so that they are
|
||||||
visible to other DLLs. */
|
visible to other DLLs. */
|
||||||
if (lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))
|
if (flag_keep_inline_dllexport
|
||||||
|
&& lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))
|
||||||
return true;
|
return true;
|
||||||
/* Otherwise, DECL does not need to be emitted -- yet. A subsequent
|
/* Otherwise, DECL does not need to be emitted -- yet. A subsequent
|
||||||
reference to DECL might cause it to be emitted later. */
|
reference to DECL might cause it to be emitted later. */
|
||||||
|
|
|
@ -3482,7 +3482,8 @@ expand_or_defer_fn_1 (tree fn)
|
||||||
if ((flag_keep_inline_functions
|
if ((flag_keep_inline_functions
|
||||||
&& DECL_DECLARED_INLINE_P (fn)
|
&& DECL_DECLARED_INLINE_P (fn)
|
||||||
&& !DECL_REALLY_EXTERN (fn))
|
&& !DECL_REALLY_EXTERN (fn))
|
||||||
|| lookup_attribute ("dllexport", DECL_ATTRIBUTES (fn)))
|
|| (flag_keep_inline_dllexport
|
||||||
|
&& lookup_attribute ("dllexport", DECL_ATTRIBUTES (fn))))
|
||||||
mark_needed (fn);
|
mark_needed (fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
@c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1996, 1998, 1999, 2000, 2001,
|
@c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1996, 1998, 1999, 2000, 2001,
|
||||||
@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
||||||
@c Free Software Foundation, Inc.
|
@c Free Software Foundation, Inc.
|
||||||
|
|
||||||
@c This is part of the GCC manual.
|
@c This is part of the GCC manual.
|
||||||
|
@ -2213,9 +2213,14 @@ On systems that support the @code{visibility} attribute, this
|
||||||
attribute also implies ``default'' visibility. It is an error to
|
attribute also implies ``default'' visibility. It is an error to
|
||||||
explicitly specify any other visibility.
|
explicitly specify any other visibility.
|
||||||
|
|
||||||
Currently, the @code{dllexport} attribute is ignored for inlined
|
In previous versions of GCC, the @code{dllexport} attribute was ignored
|
||||||
functions, unless the @option{-fkeep-inline-functions} flag has been
|
for inlined functions, unless the @option{-fkeep-inline-functions} flag
|
||||||
used. The attribute is also ignored for undefined symbols.
|
had been used. The default behaviour now is to emit all dllexported
|
||||||
|
inline functions; however, this can cause object file-size bloat, in
|
||||||
|
which case the old behaviour can be restored by using
|
||||||
|
@option{-fno-keep-inline-dllexport}.
|
||||||
|
|
||||||
|
The attribute is also ignored for undefined symbols.
|
||||||
|
|
||||||
When applied to C++ classes, the attribute marks defined non-inlined
|
When applied to C++ classes, the attribute marks defined non-inlined
|
||||||
member functions and static data members as exports. Static consts
|
member functions and static data members as exports. Static consts
|
||||||
|
|
|
@ -6149,6 +6149,13 @@ abstract measurement of function's size. In no way does it represent a count
|
||||||
of assembly instructions and as such its exact meaning might change from one
|
of assembly instructions and as such its exact meaning might change from one
|
||||||
release to an another.
|
release to an another.
|
||||||
|
|
||||||
|
@item -fno-keep-inline-dllexport
|
||||||
|
@opindex -fno-keep-inline-dllexport
|
||||||
|
This is a more fine-grained version of @option{-fkeep-inline-functions},
|
||||||
|
which applies only to functions that are declared using the @code{dllexport}
|
||||||
|
attribute or declspec (@xref{Function Attributes,,Declaring Attributes of
|
||||||
|
Functions}.)
|
||||||
|
|
||||||
@item -fkeep-inline-functions
|
@item -fkeep-inline-functions
|
||||||
@opindex fkeep-inline-functions
|
@opindex fkeep-inline-functions
|
||||||
In C, emit @code{static} functions that are declared @code{inline}
|
In C, emit @code{static} functions that are declared @code{inline}
|
||||||
|
|
|
@ -1,3 +1,18 @@
|
||||||
|
2011-01-26 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||||
|
|
||||||
|
* gcc.dg/dll-9a.c: New test file.
|
||||||
|
* gcc.dg/dll-11.c: Likewise.
|
||||||
|
* gcc.dg/dll-12.c: Likewise.
|
||||||
|
* gcc.dg/dll-12a.c: Likewise.
|
||||||
|
* gcc.dg/dll-11a.c: Likewise.
|
||||||
|
* gcc.dg/dll-9.c: Likewise.
|
||||||
|
* gcc.dg/dll-10.c: Likewise.
|
||||||
|
* gcc.dg/dll-10a.c: Likewise.
|
||||||
|
* g++.dg/ext/dllexport4a.cc: Likewise.
|
||||||
|
* g++.dg/ext/dllexport4.C: Likewise.
|
||||||
|
* g++.dg/ext/dllexport5.C: Likewise.
|
||||||
|
* g++.dg/ext/dllexport5a.cc: Likewise.
|
||||||
|
|
||||||
2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
|
2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
|
||||||
|
|
||||||
PR tree-optimization/46970
|
PR tree-optimization/46970
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
// { dg-do link }
|
||||||
|
// { dg-require-dll "" }
|
||||||
|
// { dg-additional-sources "dllexport4a.cc" }
|
||||||
|
// { dg-options "-O2 -fno-keep-inline-dllexport" }
|
||||||
|
// { dg-prune-output .*undefined.* }
|
||||||
|
// { dg-xfail-if "link failure expected" { *-*-* } }
|
||||||
|
|
||||||
|
/* Test that inline functions declared "dllexport" appear in object files,
|
||||||
|
even if they are not called - except when -fno-keep-inline-dllexport.
|
||||||
|
|
||||||
|
This behavior is required by the ARM C++ ABI:
|
||||||
|
|
||||||
|
Exporting a function that can be inlined should force the
|
||||||
|
creation and export of an out-of-line copy of it.
|
||||||
|
|
||||||
|
and should presumably also apply.
|
||||||
|
|
||||||
|
Visual Studio 2005 also honors that rule. */
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i1() {}
|
||||||
|
|
||||||
|
__declspec(dllexport) extern inline void e1() {}
|
||||||
|
|
||||||
|
/* It is invalid to declare the function inline after its definition. */
|
||||||
|
#if 0
|
||||||
|
__declspec(dllexport) void i2() {}
|
||||||
|
inline void i2();
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e2() {}
|
||||||
|
inline void e2();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i3() {}
|
||||||
|
void i3();
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e3() {}
|
||||||
|
extern void e3();
|
||||||
|
|
||||||
|
__declspec(dllexport) void i4();
|
||||||
|
inline void i4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e4();
|
||||||
|
inline void e4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i5();
|
||||||
|
void i5() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e5();
|
||||||
|
extern void e5() {};
|
||||||
|
|
||||||
|
/* Make sure that just declaring the function -- without defining it
|
||||||
|
-- does not cause errors. */
|
||||||
|
__declspec(dllexport) inline void i6();
|
||||||
|
__declspec(dllexport) extern inline void e6();
|
|
@ -0,0 +1,21 @@
|
||||||
|
extern void i1();
|
||||||
|
extern void i3();
|
||||||
|
extern void i4();
|
||||||
|
extern void i5();
|
||||||
|
|
||||||
|
extern void e1();
|
||||||
|
extern void e3();
|
||||||
|
extern void e4();
|
||||||
|
extern void e5();
|
||||||
|
|
||||||
|
int main () {
|
||||||
|
i1();
|
||||||
|
i3();
|
||||||
|
i4();
|
||||||
|
i5();
|
||||||
|
|
||||||
|
e1();
|
||||||
|
e3();
|
||||||
|
e4();
|
||||||
|
e5();
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
// { dg-do link }
|
||||||
|
// { dg-require-dll "" }
|
||||||
|
// { dg-additional-sources "dllexport5a.cc" }
|
||||||
|
// { dg-options "-O2 -fkeep-inline-dllexport" }
|
||||||
|
|
||||||
|
/* Test that inline functions declared "dllexport" appear in object files,
|
||||||
|
even if they are not called, when -fkeep-inline-dllexport is supplied.
|
||||||
|
|
||||||
|
This behavior is required by the ARM C++ ABI:
|
||||||
|
|
||||||
|
Exporting a function that can be inlined should force the
|
||||||
|
creation and export of an out-of-line copy of it.
|
||||||
|
|
||||||
|
and should presumably also apply.
|
||||||
|
|
||||||
|
Visual Studio 2005 also honors that rule. */
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i1() {}
|
||||||
|
|
||||||
|
__declspec(dllexport) extern inline void e1() {}
|
||||||
|
|
||||||
|
/* It is invalid to declare the function inline after its definition. */
|
||||||
|
#if 0
|
||||||
|
__declspec(dllexport) void i2() {}
|
||||||
|
inline void i2();
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e2() {}
|
||||||
|
inline void e2();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i3() {}
|
||||||
|
void i3();
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e3() {}
|
||||||
|
extern void e3();
|
||||||
|
|
||||||
|
__declspec(dllexport) void i4();
|
||||||
|
inline void i4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e4();
|
||||||
|
inline void e4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i5();
|
||||||
|
void i5() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e5();
|
||||||
|
extern void e5() {};
|
||||||
|
|
||||||
|
/* Make sure that just declaring the function -- without defining it
|
||||||
|
-- does not cause errors. */
|
||||||
|
__declspec(dllexport) inline void i6();
|
||||||
|
__declspec(dllexport) extern inline void e6();
|
|
@ -0,0 +1,21 @@
|
||||||
|
extern void i1();
|
||||||
|
extern void i3();
|
||||||
|
extern void i4();
|
||||||
|
extern void i5();
|
||||||
|
|
||||||
|
extern void e1();
|
||||||
|
extern void e3();
|
||||||
|
extern void e4();
|
||||||
|
extern void e5();
|
||||||
|
|
||||||
|
int main () {
|
||||||
|
i1();
|
||||||
|
i3();
|
||||||
|
i4();
|
||||||
|
i5();
|
||||||
|
|
||||||
|
e1();
|
||||||
|
e3();
|
||||||
|
e4();
|
||||||
|
e5();
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/* { dg-do link } */
|
||||||
|
/* { dg-require-dll "" } */
|
||||||
|
/* { dg-additional-sources "dll-10a.c" } */
|
||||||
|
/* { dg-options "-w -O2 -std=gnu99 -fno-keep-inline-dllexport" } */
|
||||||
|
/* { dg-prune-output .*undefined.* } */
|
||||||
|
/* { dg-xfail-if "link failure expected" { *-*-* } } */
|
||||||
|
|
||||||
|
/* Test that inline functions declared "dllexport" appear in object files,
|
||||||
|
even if they are not called - except when -fno-keep-inline-dllexport.
|
||||||
|
|
||||||
|
This behavior is required by the ARM C++ ABI:
|
||||||
|
|
||||||
|
Exporting a function that can be inlined should force the
|
||||||
|
creation and export of an out-of-line copy of it.
|
||||||
|
|
||||||
|
and should presumably also apply.
|
||||||
|
|
||||||
|
Visual Studio 2005 also honors that rule. */
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i1() {}
|
||||||
|
|
||||||
|
__declspec(dllexport) extern inline void e1() {}
|
||||||
|
|
||||||
|
/* It is invalid to declare the function inline after its definition. */
|
||||||
|
#if 0
|
||||||
|
__declspec(dllexport) void i2() {}
|
||||||
|
inline void i2();
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e2() {}
|
||||||
|
inline void e2();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i3() {}
|
||||||
|
void i3();
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e3() {}
|
||||||
|
extern void e3();
|
||||||
|
|
||||||
|
__declspec(dllexport) void i4();
|
||||||
|
inline void i4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e4();
|
||||||
|
inline void e4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i5();
|
||||||
|
void i5() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e5();
|
||||||
|
extern void e5() {};
|
||||||
|
|
||||||
|
/* Make sure that just declaring the function -- without defining it
|
||||||
|
-- does not cause errors. */
|
||||||
|
__declspec(dllexport) inline void i6();
|
||||||
|
__declspec(dllexport) extern inline void e6();
|
|
@ -0,0 +1,21 @@
|
||||||
|
extern void i1();
|
||||||
|
extern void i3();
|
||||||
|
extern void i4();
|
||||||
|
extern void i5();
|
||||||
|
|
||||||
|
extern void e1();
|
||||||
|
extern void e3();
|
||||||
|
extern void e4();
|
||||||
|
extern void e5();
|
||||||
|
|
||||||
|
int main () {
|
||||||
|
i1();
|
||||||
|
i3();
|
||||||
|
i4();
|
||||||
|
i5();
|
||||||
|
|
||||||
|
e1();
|
||||||
|
e3();
|
||||||
|
e4();
|
||||||
|
e5();
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/* { dg-do link } */
|
||||||
|
/* { dg-require-dll "" } */
|
||||||
|
/* { dg-additional-sources "dll-11a.c" } */
|
||||||
|
/* { dg-options "-w -O2 -std=gnu89 -fkeep-inline-dllexport" } */
|
||||||
|
|
||||||
|
/* Test that inline functions declared "dllexport" appear in object files,
|
||||||
|
even if they are not called, when -fkeep-inline-dllexport is supplied.
|
||||||
|
|
||||||
|
This behavior is required by the ARM C++ ABI:
|
||||||
|
|
||||||
|
Exporting a function that can be inlined should force the
|
||||||
|
creation and export of an out-of-line copy of it.
|
||||||
|
|
||||||
|
and should presumably also apply.
|
||||||
|
|
||||||
|
Visual Studio 2005 also honors that rule. */
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i1() {}
|
||||||
|
|
||||||
|
__declspec(dllexport) extern inline void e1() {}
|
||||||
|
|
||||||
|
/* It is invalid to declare the function inline after its definition. */
|
||||||
|
#if 0
|
||||||
|
__declspec(dllexport) void i2() {}
|
||||||
|
inline void i2();
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e2() {}
|
||||||
|
inline void e2();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i3() {}
|
||||||
|
void i3();
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e3() {}
|
||||||
|
extern void e3();
|
||||||
|
|
||||||
|
__declspec(dllexport) void i4();
|
||||||
|
inline void i4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e4();
|
||||||
|
inline void e4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i5();
|
||||||
|
void i5() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e5();
|
||||||
|
extern void e5() {};
|
||||||
|
|
||||||
|
/* Make sure that just declaring the function -- without defining it
|
||||||
|
-- does not cause errors. */
|
||||||
|
__declspec(dllexport) inline void i6();
|
||||||
|
__declspec(dllexport) extern inline void e6();
|
|
@ -0,0 +1,21 @@
|
||||||
|
extern void i1();
|
||||||
|
extern void i3();
|
||||||
|
extern void i4();
|
||||||
|
extern void i5();
|
||||||
|
|
||||||
|
extern void e1();
|
||||||
|
extern void e3();
|
||||||
|
extern void e4();
|
||||||
|
extern void e5();
|
||||||
|
|
||||||
|
int main () {
|
||||||
|
i1();
|
||||||
|
i3();
|
||||||
|
i4();
|
||||||
|
i5();
|
||||||
|
|
||||||
|
e1();
|
||||||
|
e3();
|
||||||
|
e4();
|
||||||
|
e5();
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/* { dg-do link } */
|
||||||
|
/* { dg-require-dll "" } */
|
||||||
|
/* { dg-additional-sources "dll-12a.c" } */
|
||||||
|
/* { dg-options "-w -O2 -std=gnu99 -fkeep-inline-dllexport" } */
|
||||||
|
|
||||||
|
/* Test that inline functions declared "dllexport" appear in object files,
|
||||||
|
even if they are not called, when -fkeep-inline-dllexport is supplied.
|
||||||
|
|
||||||
|
This behavior is required by the ARM C++ ABI:
|
||||||
|
|
||||||
|
Exporting a function that can be inlined should force the
|
||||||
|
creation and export of an out-of-line copy of it.
|
||||||
|
|
||||||
|
and should presumably also apply.
|
||||||
|
|
||||||
|
Visual Studio 2005 also honors that rule. */
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i1() {}
|
||||||
|
|
||||||
|
__declspec(dllexport) extern inline void e1() {}
|
||||||
|
|
||||||
|
/* It is invalid to declare the function inline after its definition. */
|
||||||
|
#if 0
|
||||||
|
__declspec(dllexport) void i2() {}
|
||||||
|
inline void i2();
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e2() {}
|
||||||
|
inline void e2();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i3() {}
|
||||||
|
void i3();
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e3() {}
|
||||||
|
extern void e3();
|
||||||
|
|
||||||
|
__declspec(dllexport) void i4();
|
||||||
|
inline void i4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e4();
|
||||||
|
inline void e4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i5();
|
||||||
|
void i5() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e5();
|
||||||
|
extern void e5() {};
|
||||||
|
|
||||||
|
/* Make sure that just declaring the function -- without defining it
|
||||||
|
-- does not cause errors. */
|
||||||
|
__declspec(dllexport) inline void i6();
|
||||||
|
__declspec(dllexport) extern inline void e6();
|
|
@ -0,0 +1,21 @@
|
||||||
|
extern void i1();
|
||||||
|
extern void i3();
|
||||||
|
extern void i4();
|
||||||
|
extern void i5();
|
||||||
|
|
||||||
|
extern void e1();
|
||||||
|
extern void e3();
|
||||||
|
extern void e4();
|
||||||
|
extern void e5();
|
||||||
|
|
||||||
|
int main () {
|
||||||
|
i1();
|
||||||
|
i3();
|
||||||
|
i4();
|
||||||
|
i5();
|
||||||
|
|
||||||
|
e1();
|
||||||
|
e3();
|
||||||
|
e4();
|
||||||
|
e5();
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/* { dg-do link } */
|
||||||
|
/* { dg-require-dll "" } */
|
||||||
|
/* { dg-additional-sources "dll-9a.c" } */
|
||||||
|
/* { dg-options "-w -O2 -std=gnu89 -fno-keep-inline-dllexport" } */
|
||||||
|
/* { dg-prune-output .*undefined.* } */
|
||||||
|
/* { dg-xfail-if "link failure expected" { *-*-* } } */
|
||||||
|
|
||||||
|
/* Test that inline functions declared "dllexport" appear in object files,
|
||||||
|
even if they are not called - except when -fno-keep-inline-dllexport.
|
||||||
|
|
||||||
|
This behavior is required by the ARM C++ ABI:
|
||||||
|
|
||||||
|
Exporting a function that can be inlined should force the
|
||||||
|
creation and export of an out-of-line copy of it.
|
||||||
|
|
||||||
|
and should presumably also apply.
|
||||||
|
|
||||||
|
Visual Studio 2005 also honors that rule. */
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i1() {}
|
||||||
|
|
||||||
|
__declspec(dllexport) extern inline void e1() {}
|
||||||
|
|
||||||
|
/* It is invalid to declare the function inline after its definition. */
|
||||||
|
#if 0
|
||||||
|
__declspec(dllexport) void i2() {}
|
||||||
|
inline void i2();
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e2() {}
|
||||||
|
inline void e2();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i3() {}
|
||||||
|
void i3();
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e3() {}
|
||||||
|
extern void e3();
|
||||||
|
|
||||||
|
__declspec(dllexport) void i4();
|
||||||
|
inline void i4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) extern void e4();
|
||||||
|
inline void e4() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void i5();
|
||||||
|
void i5() {};
|
||||||
|
|
||||||
|
__declspec(dllexport) inline void e5();
|
||||||
|
extern void e5() {};
|
||||||
|
|
||||||
|
/* Make sure that just declaring the function -- without defining it
|
||||||
|
-- does not cause errors. */
|
||||||
|
__declspec(dllexport) inline void i6();
|
||||||
|
__declspec(dllexport) extern inline void e6();
|
|
@ -0,0 +1,21 @@
|
||||||
|
extern void i1();
|
||||||
|
extern void i3();
|
||||||
|
extern void i4();
|
||||||
|
extern void i5();
|
||||||
|
|
||||||
|
extern void e1();
|
||||||
|
extern void e3();
|
||||||
|
extern void e4();
|
||||||
|
extern void e5();
|
||||||
|
|
||||||
|
int main () {
|
||||||
|
i1();
|
||||||
|
i3();
|
||||||
|
i4();
|
||||||
|
i5();
|
||||||
|
|
||||||
|
e1();
|
||||||
|
e3();
|
||||||
|
e4();
|
||||||
|
e5();
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
/* Language-independent node constructors for parse phase of GNU compiler.
|
/* Language-independent node constructors for parse phase of GNU compiler.
|
||||||
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
||||||
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||||
Free Software Foundation, Inc.
|
2011 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
@ -5509,7 +5509,8 @@ handle_dll_attribute (tree * pnode, tree name, tree args, int flags,
|
||||||
DECL_DLLIMPORT_P (node) = 1;
|
DECL_DLLIMPORT_P (node) = 1;
|
||||||
}
|
}
|
||||||
else if (TREE_CODE (node) == FUNCTION_DECL
|
else if (TREE_CODE (node) == FUNCTION_DECL
|
||||||
&& DECL_DECLARED_INLINE_P (node))
|
&& DECL_DECLARED_INLINE_P (node)
|
||||||
|
&& flag_keep_inline_dllexport)
|
||||||
/* An exported function, even if inline, must be emitted. */
|
/* An exported function, even if inline, must be emitted. */
|
||||||
DECL_EXTERNAL (node) = 0;
|
DECL_EXTERNAL (node) = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue