This is the mail archive of the
mailing list for the GCC project.
RE: [RFC] Introducing MIPS O32 ABI Extension for FR0 and FR1 Interlinking
- From: Matthew Fortune <Matthew dot Fortune at imgtec dot com>
- To: Richard Sandiford <rdsandiford at googlemail dot com>
- Cc: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>, Rich Fuhler <Rich dot Fuhler at imgtec dot com>, "macro at codesourcery dot com" <macro at codesourcery dot com>, "Joseph Myers (joseph at codesourcery dot com)" <joseph at codesourcery dot com>, "Moore, Catherine (Catherine_Moore at mentor dot com)" <Catherine_Moore at mentor dot com>
- Date: Tue, 4 Mar 2014 22:40:19 +0000
- Subject: RE: [RFC] Introducing MIPS O32 ABI Extension for FR0 and FR1 Interlinking
- Authentication-results: sourceware.org; auth=none
- References: <6D39441BF12EF246A7ABCE6654B023534AAE6E at LEMAIL01 dot le dot imgtec dot org> <87mwhhg9e5 dot fsf at talisman dot default> <6D39441BF12EF246A7ABCE6654B023534AC1F0 at LEMAIL01 dot le dot imgtec dot org> <878ut0fj45 dot fsf at talisman dot default> <6D39441BF12EF246A7ABCE6654B023534AD16E at LEMAIL01 dot le dot imgtec dot org> <87ppmbdobm dot fsf at talisman dot default> <6D39441BF12EF246A7ABCE6654B023534AEB92 at LEMAIL01 dot le dot imgtec dot org> <6D39441BF12EF246A7ABCE6654B023534B4C29 at LEMAIL01 dot le dot imgtec dot org> <87r46hbybi dot fsf at talisman dot default> <6D39441BF12EF246A7ABCE6654B023534B572B at LEMAIL01 dot le dot imgtec dot org> <87mwh5bslv dot fsf at talisman dot default>
Richard Sandiford <firstname.lastname@example.org> writes:
> Matthew Fortune <Matthew.Fortune@imgtec.com> writes:
> >> Matthew Fortune <Matthew.Fortune@imgtec.com> writes:
> >> >> > Sorry, forgot about that. In that case maybe program headers
> >> >> > would be best, like you say. I.e. we could use a combination of
> >> >> > GNU attributes and a new program header, with the program header
> >> >> > hopefully being more general than for just this case. I suppose
> >> >> > this comes back to the thread from binutils@ last year about how
> >> >> > to manage the dwindling number of free flags:
> >> >> >
> >> >> > https://www.sourceware.org/ml/binutils/2013-09/msg00039.html
> >> >> > to https://www.sourceware.org/ml/binutils/2013-09/msg00099.html
> >> >> >
> >> >
> >> > There are a couple of issues to resolve in order to use gnu
> >> > attributes to record FP requirements at the module level. As it
> >> > currently stands gnu attributes are controlled via the
> >> > .gnu_attribute directive and these are emitted explicitly by the
> >> > compiler. I think it is important that a more meaningful directive
> >> > is available but it will need to interact nicely with the
> .gnu_attribute as well.
> >> >
> >> > The first problem is that there will be new ways to influence
> >> > whether a gnu attribute is emitted or not. i.e. the command line
> >> > options -mfp32, -mfpxx, -mfp64 will infer the relevant attribute
> >> > Tag_GNU_MIPS_ABI_FP and if the .module directive is present then
> >> > that would override it. Will there be any problems with a new ways
> >> > to
> >> generate a gnu attribute?
> >> I think we should just give an error if any .gnu_attributes are
> >> inconsistent with the module-level setting (whether that comes from
> >> .module or command-line flags).
> > I would need to account for the -msoft-float and -msingle-float
> > command line options to calculate module-level setting in order to do
> > this, which is fine. There is however no way to infer the no-float ABI
> > from command line options as it is not passed through from the GCC
> > driver. This would mean the no-float ABI would always conflict with
> > the module level setting.
> -mno-float the GCC option doesn't really select a different ABI.
> It does leave the FP attribute as being the default 0/dont-care, but
> that's just like it would be when compiling most hand-written assembly
> code, including code written before -mno-float or .gnu_attribute was
> > I suspect the only answer is to make an exception and allow a
> > .gnu_attribute 4,0 to take precedence over a command line option (but
> > not a .module option). This seems a little convoluted in the end.
> I don't think we should ever override an explicit .gnu_attribute.
> The most we can do is report a contradiction.
> >> > The second problem is that in order to support relaxing a mode
> >> > requirement then any up-front directive/command line option that
> >> > sets a specific fp32/fp64 requirement needs to be updated to fpxx.
> >> > With gnu attributes this would mean updating an existing
> >> > Tag_GNU_MIPS_ABI_FP setting to be modeless.
> >> Not sure what you mean here, sorry.
> > At the end of a unit we will know whether an FP32 or FP64 ABI can be
> > relaxed to FPXX. This will happen if no floating point code has been
> > emitted that uses odd numbered registers. All I was checking is that
> > it is going to be acceptable to alter the FP ABI attribute even if it
> > was set using the .gnu_attribute directive. I know I 'can' do it in
> > the code as I have it working already just checking that it is OK. I
> > suppose this case is going to be quite rare (hand written assembly
> > code that includes a .gnu_attribute 4,1 which is mode safe) but I'd
> > like to catch as many cases as possible and relax the ABI.
> Yeah, I don't think we should do any relaxation like that. If a
> specific attribute value is chosen we should honour it even if it
> doesn't seem necessary. If -mfp32, -mfp64, .module fp=32 or .module
> fp=64 is used we should honour it even if -mfpxx or .module fp=xx seems
Are you're OK with automatically selecting fpxx if no -mfp option, no .module and no .gnu_attribute exists? Such code would currently end up as FP ABI Any even if FP code was present, I don't suppose anything would get worse if this existing behaviour simply continued though.
For this to be sufficient we would be making the assumption that there is almost no hand written code that has a .gnu_attribute directive nor build system that explicitly uses the -mfp32 option. I think this will certainly hold true for assembly modules that have no FP code in them but presumably anyone who has hand-written FP code will have used the .gnu_attribute. We will lose the ability for such modules to quietly transition to fpxx but I have no data to say how many of such modules exist or may exist in the future. I still need to check if there are any hand written FP modules in the standard libraries. I am concerned about this aspect but I expect it could be revisited if it turns out to be overly cautious or restrictive.
Thinking specifically about potential projects that may want to have hand written fpxx code with new tools and still build with older tools... The only solution I can see is that it would be possible with some configure time detection of whether the .module directive is supported and then some pre-processing to emit a suitable directive (.gnu_attribute 4,1 for old tools and .module fpxx for new).