On 8/25/20 8:48 PM, Jan Hubicka wrote:
gcc/ChangeLog:
* cgraphunit.c (process_symver_attribute): Allow multiple
symver attributes for one symbol.
* doc/extend.texi: Document the change.
gcc/testsuite/ChangeLog:
* lib/target-supports-dg.exp: Add dg-require-symver.
* lib/target-supports.exp: Likewise.
* gcc.dg/ipa/symver1.c: New test.
---
gcc/cgraphunit.c | 143 ++++++++++++-----------
gcc/doc/extend.texi | 10 +-
gcc/testsuite/gcc.dg/ipa/symver1.c | 11 ++
gcc/testsuite/lib/target-supports-dg.exp | 10 ++
gcc/testsuite/lib/target-supports.exp | 12 ++
5 files changed, 110 insertions(+), 76 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/ipa/symver1.c
@smallexample
-__attribute__ ((__symver__ ("foo@@VERS_2")))
-__attribute__ ((alias ("foo_v1")))
-int symver_foo_v1 (void);
+__attribute__ ((__symver__ ("foo@@VERS_2"), ("foo@@VERS_3")))
+int symver_foo_v1 (void)
So we can still write it as follows:
+__attribute__ ((__symver__ ("foo@@VERS_2"))))
+__attribute__ ((__symver__ ("foo@@VERS_3"))))
+int symver_foo_v1 (void)
I think we should support this syntax so the versions can be added
separately by macros mixed with other attributs....
Yes, the syntax is supported as well and I'm adding that to documentation.
I'm going to push this commit.
Thanks for review,
Martin
Honza
+@{
+@}
@end smallexample
This example creates an alias of @code{foo_v1} with symbol name
diff --git a/gcc/testsuite/gcc.dg/ipa/symver1.c
b/gcc/testsuite/gcc.dg/ipa/symver1.c
new file mode 100644
index 00000000000..645de7ea259
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/symver1.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+__attribute__ ((__symver__ ("foo@VER_2")))
+__attribute__ ((__symver__ ("foo@VER_3")))
+int foo()
+{
+ return 2;
+}
+
+/* { dg-final { scan-assembler ".symver.*foo, foo@VER_2" } } */
+/* { dg-final { scan-assembler ".symver.*foo, foo@VER_3" } } */
diff --git a/gcc/testsuite/lib/target-supports-dg.exp
b/gcc/testsuite/lib/target-supports-dg.exp
index 5bb99f4e8f9..4a03eaae9ce 100644
--- a/gcc/testsuite/lib/target-supports-dg.exp
+++ b/gcc/testsuite/lib/target-supports-dg.exp
@@ -665,3 +665,13 @@ if { [info procs saved-dg-process-target] == [list] } {
return [dg-process-target-1 $selector]
}
}
+
+# If this target does not support the "symver" attribute, skip this
+# test.
+
+proc dg-require-symver { args } {
+ if { ![ check_symver_available ] } {
+ upvar dg-do-what dg-do-what
+ set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
+ }
+}
diff --git a/gcc/testsuite/lib/target-supports.exp
b/gcc/testsuite/lib/target-supports.exp
index c24330a27ab..f3fc5b80aea 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -10445,3 +10445,15 @@ proc check_effective_target_large_initializer { } {
return 1
}
+# Returns 1 if the target toolchain supports extended
+# syntax of .symver directive, 0 otherwise.
+
+proc check_symver_available { } {
+ return [check_no_compiler_messages symver_available object {
+ int foo(void) { return 0; }
+ int main (void) {
+ asm volatile (".symver foo,foo@VER_1, local");
+ return 0;
+ }
+ }]
+}