[PATCH][mips] Introduce '.set noase' to the mips assembler.
Egeyar Bagcioglu
egeyar.bagcioglu@oracle.com
Thu Oct 3 14:07:00 GMT 2019
ping.
I have corrected the gas/ChangeLog below.
Adding mips maintainers Maciej W. Rozycki and Chenghua Xu.
Regards,
Egeyar
On 9/26/19 7:51 PM, Egeyar Bagcioglu wrote:
> Hello,
>
> I would like to propose the attached tiny patch, together with the
> lengthy explanation of its use case. Please review.
>
> Currently, the mips assembler keeps, as a part of its runtime state,
> information regarding the accepted ISA and ASEs (Application Specific
> Extensions). It is possible to change the ISA or allowed extensions on
> the fly. It is also possible to use ".set push" to save the state
> regarding the accepted instructions, change them, and pop the
> previously pushed state afterwards.
>
> Linux kernel takes advantage of this situation in its mips inline
> assembly functions. The assembler is asked to push into the stack the
> information of the target platform. The ISA is then set to mips3,
> which is the strictest, to make sure that the assembler generates an
> error if the inline assembler is not accepted by all mips platforms.
> At the end of the inline assembly, the previous state of the assembler
> is restored with a ".set pop":
>
> .set push
> .set mips3Â Â Â Â Â #the base ISA
> <assembly>
> .set pop
>
> The above usage works mostly, when no ASEs are enabled or when the
> enabled ASEs are accepted in mips3 due other settings (such as
> micromips being enabled, etc.). If, however, a conflicting ASE is
> enabled, the switch to mips3 causes the assembler to generate a
> warning per file because mips3 does not support that given ASE. While
> building a big project such as the kernel, one warning per file with
> inline assembly means several hundreds of warnings in total.
>
> I have considered different ways to solve this issue. If we implicitly
> disable the unsupported ASEs upon switching to a new ISA, we lose
> backwards compatibility. Any project which is -for whatever reason-
> generating some extension instructions that are not supported by the
> given ISA would start getting errors from the assembler. If we decide
> to turn off the warnings under whatever condition, the assembler would
> start accepting unsupported extension instructions without even a
> warning. This would, for example, undermine the kernel's use-case. A
> more-user-friendly option could be delaying the warning. We would not
> warn when a conflicting ISA is set. Instead, we would store this
> information, check the following instructions and only warn if/when we
> see the first instruction using a conflicting ASE. However, I believe
> the overhead of this approach could not be justified by the need.
>
> The change I propose is to add a new ".set noase" directive to disable
> all the ASEs. This pseudo-op would be beneficial primarily within .set
> push/pop pairs of inline assembly functions as used by the kernel, by
> explicitly disabling all 19 extensions of mips architecture and
> avoiding the related warnings. An example usage of it would transform
> the inline assembly functions into the following format:
>
> .set push
> .set noase
> .set mips3Â Â Â #the base ISA
> <assembly>
> .set pop
>
>
> As .set push/pop pairs also saves and restores the state of enabled
> ASEs, this would indeed serve the purpose of limiting the generation
> of extension instructions within that pair, without permanently
> changing which instructions are allowed. Having said that, the
> execution of this directive does not depend on the .set push/pop
> pairs. Therefore, it can also be used separately.
>
> I do not know how likely it is for the kernel or other projects to use
> this new directive as it would depend on a very new binutils patch.
> Although, it might be applied together with a macro controlling its
> usage. Either way, I still see value in assembler supporting such a
> usage.
>
> As it is new, this directive does not interfere with the existing
> regression tests. Therefore, you'll see a new test case in the patch
> as well.
>
> The suggested gas/ChangeLog is
> 2019-09-26 Egeyar Bagcioglu <egeyar.bagcioglu@oracle.com>
>
> Â Â Â Â Â Â Â * config/tc-mips.c (parse_code_option): Introduce ".set/.module
> Â Â Â Â Â Â Â noase" pseudo-op to disable all Application Specific Extensions.
> Â Â Â Â Â Â Â * testsuite/gas/mips/ase-errors-5.l: New test.
> Â Â Â Â Â Â Â * testsuite/gas/mips/ase-errors-5.s: New test source.
> Â Â Â Â Â Â Â * testsuite/gas/mips/mips.exp: Run the new test.
>
>
> Please review and let me know what you think.
>
> Thanks,
> Egeyar
More information about the Binutils
mailing list