From b53bb376d9dfa10371ebf3a237ccea477091ed0c Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 25 May 2002 20:38:37 -0700 Subject: [PATCH] c-pragma.c (apply_pragma_weak): Convert value identifier to string for decl_attributes. * c-pragma.c (apply_pragma_weak): Convert value identifier to string for decl_attributes. (handle_pragma_weak): Call assemble_alias if we're modifying an existing decl. From-SVN: r53884 --- gcc/ChangeLog | 7 +++++++ gcc/c-pragma.c | 17 +++++++++++++---- gcc/testsuite/gcc.dg/weak-9.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/weak-9.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e76b87f6f03..34ab44dd5a6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-05-25 Richard Henderson + + * c-pragma.c (apply_pragma_weak): Convert value identifier to + string for decl_attributes. + (handle_pragma_weak): Call assemble_alias if we're modifying + an existing decl. + 2002-05-25 Richard Henderson PR target/6788 diff --git a/gcc/c-pragma.c b/gcc/c-pragma.c index 8801c697a8c..1a016b8b220 100644 --- a/gcc/c-pragma.c +++ b/gcc/c-pragma.c @@ -283,9 +283,14 @@ apply_pragma_weak (decl, value) tree decl, value; { if (value) - decl_attributes (&decl, build_tree_list (get_identifier ("alias"), - build_tree_list (NULL, value)), - 0); + { + value = build_string (IDENTIFIER_LENGTH (value), + IDENTIFIER_POINTER (value)); + decl_attributes (&decl, build_tree_list (get_identifier ("alias"), + build_tree_list (NULL, value)), + 0); + } + if (SUPPORTS_WEAK && DECL_EXTERNAL (decl) && TREE_USED (decl) && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))) warning_with_decl (decl, "applying #pragma weak `%s' after first use results in unspecified behavior"); @@ -342,7 +347,11 @@ handle_pragma_weak (dummy) decl = identifier_global_value (name); if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd') - apply_pragma_weak (decl, value); + { + apply_pragma_weak (decl, value); + if (value) + assemble_alias (decl, value); + } else pending_weaks = tree_cons (name, value, pending_weaks); } diff --git a/gcc/testsuite/gcc.dg/weak-9.c b/gcc/testsuite/gcc.dg/weak-9.c new file mode 100644 index 00000000000..dd5f6256693 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak-9.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-common" } */ + +/* COFF does not support weak, and dg doesn't support UNSUPPORTED. */ +/* { dg-do compile { xfail *-*-coff i?86-pc-cygwin h8300-*-hms } } */ + +/* { dg-final { global target_triplet } } */ +/* { dg-final { if [string match h8300-*-hms $target_triplet ] {return} } } */ +/* { dg-final { if [string match i?86-pc-cygwin $target_triplet ] {return} } } * +/ +/* { dg-final { if [string match *-*-coff $target_triplet ] {return} } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f1" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f2" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f3" } } */ +/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f4" } } */ +/* { dg-final { scan-assembler "notf1" } } */ +/* { dg-final { scan-assembler "notf2" } } */ +/* { dg-final { scan-assembler "notf3" } } */ +/* { dg-final { scan-assembler "notf4" } } */ + +void f1() __attribute__((weak, alias("notf1"))); +void f2() __attribute__((alias("notf2"), weak)); + +#pragma weak f3=notf3 +void f3(); + +void f4(); +#pragma weak f4=notf4 -- 2.30.2