This is an archive of the discontinued LLVM Phabricator instance.

[RISCV] Diagnose invalid second input register operand when using %tprel_add
ClosedPublic

Authored by rogfer01 on Apr 10 2019, 11:59 AM.

Details

Summary

RISCVMCCodeEmitter::expandAddTPRel asserts that the second operand must be x4/tp. As we are not currently checking this in the RISCVAsmParser, the assert is easy to trigger due to wrong assembly input.

This patch does a late check of this constraint.

An alternative could be using a singleton register class for x4/tp similar to the current one for sp. Unfortunately it does not result in a good diagnostic. Because add is an overloaded mnemonic, if no matching is possible, the diagnostic of the first failing alternative seems to be used as the diagnostic itself. This means that this case the %tprel_add is diagnosed as an invalid operand (because the real add instruction only has 3 operands).

Diff Detail

Event Timeline

rogfer01 created this revision.Apr 10 2019, 11:59 AM
Herald added a project: Restricted Project. · View Herald TranscriptApr 10 2019, 11:59 AM
rogfer01 retitled this revision from [RISCV] Diagnose invalid second register operand when using %tprel_add to [RISCV] Diagnose invalid second input register operand when using %tprel_add.Apr 10 2019, 12:00 PM
asb added a comment.Apr 11 2019, 4:08 AM

Good catch Roger, thanks! This looks good to me, though I wonder if it's worth being a bit more explicit in the checkPseudoAddTPRel comment.

lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
101

I'd consider incorporating more of the reasoning from your commit message here, so it's more self-documenting. e.g. "Enforcing this using a restricted register class for the second input operand of PseudoAddTPRel results in a poor diagnostic due to the fact 'add' is an overloaded mnemonic."

asb accepted this revision.Apr 11 2019, 5:00 AM
This revision is now accepted and ready to land.Apr 11 2019, 5:00 AM
rogfer01 updated this revision to Diff 194681.Apr 11 2019, 7:29 AM

ChangeLog:

  • Improve comment with wording kindly suggested by Alex Bradbury
rogfer01 marked an inline comment as done.Apr 11 2019, 7:34 AM

Thanks a lot for the review Alex!

This revision was automatically updated to reflect the committed changes.
jrtc27 added inline comments.Jul 1 2019, 4:24 AM
llvm/trunk/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
1701 ↗(On Diff #194695)

This is rather nasty, as it currently implicitly falls through to the end of the switch block rather than with an explicit break, so any new cases need to either come before this one or add the break in. Could you please add the break in a follow-up commit?

MaskRay added a subscriber: MaskRay.Jul 1 2019, 4:41 AM
MaskRay added inline comments.
llvm/trunk/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
1701 ↗(On Diff #194695)

Done in r364746.