FW: [PATCH] [MIPS] microMIPS gcc support
Richard Sandiford
rdsandiford@googlemail.com
Sat Jan 26 10:17:00 GMT 2013
"Maciej W. Rozycki" <macro@codesourcery.com> writes:
> On Wed, 23 Jan 2013, Richard Sandiford wrote:
>> > Index: config/mips/gnu-user.h
>> > ===================================================================
>> > --- config/mips/gnu-user.h (revision 195351)
>> > +++ config/mips/gnu-user.h (working copy)
>> > @@ -137,3 +137,12 @@ extern const char *host_detect_local_cpu (int argc
>> > #define ENDFILE_SPEC \
>> > GNU_USER_TARGET_MATHFILE_SPEC " " \
>> > GNU_USER_TARGET_ENDFILE_SPEC
>> > +
>> > +#undef SUBTARGET_OVERRIDE_OPTIONS
>> > +#define SUBTARGET_OVERRIDE_OPTIONS \
>> > +do { \
>> > + /* microMIPS PLT entries are non-microMIPS. */ \
>> > + TARGET_INTERLINK_COMPRESSED = 1; \
>> > +} while (0)
>> > +
>> > +
>>
>> Hmm, that sounds like a reason to set TARGET_INTERLINK_UNCOMPRESSED
>> rather than TARGET_INTERLINK_COMPRESSED. I.e. we need to avoid direct
>> branches from microMIPS code to standard PLTs.
>>
>> But that means that microMIPS code can't even jump directly to functions
>> that have a micromips attribute when the call might go via a PLT.
>> TARGET_INTERLINK_(UN)COMPRESSED doesn't cover that case. I think instead
>> we need to handle it directly in mips_function_ok_for_sibcall,
>> keyed off TARGET_ABICALLS_PIC0. Specific suggestion below.
> [...]
>> > /* We can't do a sibcall if the called function is a MIPS16 function
>> > because there is no direct "jx" instruction equivalent to "jalx" to
>> > switch the ISA mode. We only care about cases where the sibling
>> > and normal calls would both be direct. */
>> > if (decl
>> > - && mips_use_mips16_mode_p (decl)
>> > + && ((compression_mode & (MASK_MIPS16 | MASK_MICROMIPS)) != 0)
>> > && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
>> > return false;
>> >
>> > - /* When -minterlink-mips16 is in effect, assume that non-locally-binding
>> > - functions could be MIPS16 ones unless an attribute explicitly tells
>> > + /* When -minterlink-compressed is in effect, assume that non-locally-binding
>> > + functions could be MIPS16 or microMIPS unless an attribute explicitly tells
>> > us otherwise. */
>> > - if (TARGET_INTERLINK_MIPS16
>> > + if (TARGET_INTERLINK_COMPRESSED
>> > && decl
>> > && (DECL_EXTERNAL (decl) || !targetm.binds_local_p (decl))
>> > - && !mips_nomips16_decl_p (decl)
>> > + && (compression_mode & MASK_MICROMIPS) == 0
>> > + && (compression_mode & MASK_MIPS16) == 0
>> > && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode))
>> > return false;
>>
>> should be something like:
>>
>> /* Direct Js are only possible to functions that use the same ISA encoding.
>> There is no JX counterpart of JALX. */
>> if (decl
>> && const_call_insn_operand (XEXP (DECL_RTL (decl), 0), VOIDmode)
>> && mips_call_may_need_jalx_p (decl))
>> return false;
>>
>> with:
>>
>> /* Return true if a call to DECL may need to use JALX. */
>>
>> static bool
>> mips_call_may_need_jalx_p (decl)
>> {
>> /* If the current translation unit would use a different mode for DECL,
>> assume that the call needs JALX. */
>> if (mips_get_compress_mode (decl) != TARGET_COMPRESSION)
>> return true;
>>
>> /* mips_get_compress_mode is always accurate for locally-binding
>> functions in the current translation unit. */
>> if (!DECL_EXTERNAL (decl) && targetm.binds_local_p (decl))
>> return false;
>>
>> /* PLTs use the standard encoding, so calls that might go via PLTs
>> must use JALX. */
>> if (TARGET_COMPRESSED
>> && TARGET_ABICALLS_PIC0
>> && DECL_EXTERNAL (decl)
>> && !targetm.binds_local_p (decl))
>> return true;
>>
>> /* When -minterlink-compressed is in effect, assume that functions
>> could use a different encoding mode unless an attribute explicitly
>> tells us otherwise. */
>> if (TARGET_INTERLINK_COMPRESSED)
>> {
>> if (!TARGET_COMPRESSION && mips_get_compress_off_flags (decl) == 0)
>> return true;
>> if (TARGET_COMPRESSION && mips_get_compress_on_flags (decl) == 0)
>> return true;
>> }
>>
>> return false;
>> }
>>
>> The TARGET_ABICALLS_PIC0 case should deal with the gnu-user.h comment above.
>
> How about instead of complicating this we simply add support for
> microMIPS encoding in the PLT? I think I should be able to squeeze out
> some time next week to dust off and retest the binutils patch I've had
> pending far too long now. This way we won't have to maintain separate
> cases where tail calls may or may not be made via the PLT.
>
> Note that we need that support sooner or later anyway due to the prospect
> of pure-microMIPS processors.
Just so I know: what does the PLT patch do for external functions
that are jumped to by both microMIPS and non-microMIPS code?
Richard
More information about the Gcc-patches
mailing list