Hi Thomas,
On 2/14/23 10:35, Thomas Schwinge wrote:
Hi!
On 2023-02-13T18:50:23+0100, Harald Anlauf via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
Pushed as:
commit 086a1df4374962787db37c1f0d1bd9beb828f9e3
On 2/12/23 22:28, Harald Anlauf via Gcc-patches wrote:
There is one thing I cannot test, which is the handling of weak symbols
on other platforms. A quick glance at the C testcases suggests that
someone with access to either an NVPTX or MingGW target might tell
whether that particular target should be excluded.
Indeed nvptx does use a different assembler syntax; I've pushed to
master branch commit 8d8175869ca94c600e64e27b7676787b2a398f6e
"nvptx: Adjust 'scan-assembler' in 'gfortran.dg/weak-1.f90'", see
attached.
thanks for taking care of this.
And I'm curious, is '!GCC$ ATTRIBUTES weak' meant to be used only for
weak definitions (like in 'gfortran.dg/weak-1.f90'), or also for weak
declarations (which, for example, in the C world then evaluate to
zero-address unless actually defined)? When I did a quick experiment,
that didn't seem to work? (But may be my fault, of course.)
And, orthogonally: is '!GCC$ ATTRIBUTES weak' meant to be used only for
subroutines (like in 'gfortran.dg/weak-1.f90') and also functions (I
suppose; test case?), or also for weak "data" in some way (which, for
example, in the C world then evaluates to a zero-address unless actually
defined)?
It also works for functions, e.g.
integer function f ()
!GCC$ ATTRIBUTES weak :: f
print *, "weak f"
f = 0
end
Regarding symbols beyond procedures (subroutines, functions),
I had a look at what Crayftn supports. Its manpage has:
```
WEAK
Syntax and use of the WEAK directive.
!DIR$ WEAK procedure_name[, procedure_name] ...
!DIR$ WEAK procedure_name= stub_name[, procedure_name1= stub_name1] ...
[...]
The WEAK directive supports the following arguments:
procedure_name
A weak object in the form of a variable or procedure.
stub_name
A stub procedure that exists in the code. The stub_name will be
called if a strong reference does not exist for procedure_name. The
stub_name procedure must have the same name and dummy argument list as
procedure_name.
```
However, testing e.g. with a module variable either gave an
error message or assembly that suggests that this does not work,
at least not with version cce/14.0.0.
Could help to at least add a few more test cases, and clarify the
documentation?
I'm not sure whether we need to support weak symbols other than
procedures in gfortran. Maybe Rimvydas can comment on this.
We could clarify the documentation an reject e.g. variables
using:
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index ff64588b9a8..75c04ad7ece 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -814,6 +814,13 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
&& (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
set_decl_tls_model (decl, decl_default_tls_model (decl));
+ if ((sym->attr.ext_attr & (1 << EXT_ATTR_WEAK))
+ && sym->attr.flavor != FL_PROCEDURE)
+ {
+ gfc_error ("Symbol %qs at %L has the WEAK attribute but is not a "
+ "procedure", sym->name, &sym->declared_at);
+ }
+
gfc_finish_decl_attrs (decl, &sym->attr);
}
This would reject code like
module m
integer :: i, j
!GCC$ ATTRIBUTES weak :: j
end
weak-1.f90:18:17:
18 | integer :: i, j
| 1
Error: Symbol 'j' at (1) has the WEAK attribute but is not a procedure
Comments and thoughts?
Cheers,
Harald
Grüße
Thomas
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht
München, HRB 106955